LeetCode 1 两数之和

    科技2022-07-10  178

    LeetCode 1 两数之和

    题目链接

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

    示例:

    给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

    暴力显然是可以的,但是肯定白给,所以得用 O ( n ) O(n) O(n) 的算法优化,我的思路如下: 首先给每个数标号,为什么要标号,因为我们无法直接对负数进行存储,然后对每个数,存出现的次数,以及对应的下标,这样扫一遍就可以得到答案了,AC代码如下:

    class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int>m,c; vector<int>ans,pos[100000]; int id=0; for(int i=0;i<nums.size();i++){ if(!m[nums[i]]) c[nums[i]]=id++; m[nums[i]]++; pos[c[nums[i]]].push_back(i); } for(auto i:nums) { if(m[i]){ m[i]--; if(m[target-i]){ m[target-i]--; ans.push_back(pos[c[i]].front()); pos[c[i]].erase(pos[c[i]].begin()); ans.push_back(pos[c[target-i]].front()); pos[c[target-i]].erase(pos[c[target-i]].begin()); } } } return ans; } };
    Processed: 0.087, SQL: 8