题目:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
思路:
1、暴力法
遍历每个元素x,寻找和 target-x 相等的目标值
时间复杂度为O(n^2)
2、两次哈希
我们首先将原来的数组放到哈希表中,key = nums[i] ,value = i
之后我们再遍历元素x,看hash[target-x]是否存在
时间复杂度O(n)
3、一次哈希
实际上,我们还可以做到更快,在进行迭代并将元素插入到表中的同时,
我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。
如果它存在,那我们已经找到了对应解,并立即将其返回。
代码:
暴力
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); vector <int> ans; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(nums[i]+nums[j]==target) { ans.push_back(i); ans.push_back(j); } } } return ans; } };
两次哈希
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); map <int,int> m; for(int i=0;i<n;i++) { m[nums[i]] = i; } vector <int> ans; for(int i=0;i<n;i++) { int k = m[target-nums[i]]; if(k&&k!=i) { ans.push_back(i); ans.push_back(k); break; } } return ans; } };
一次哈希
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); map <int,int> m; vector <int> ans; for(int i=0;i<n;i++) { auto iter = m.find(target-nums[i]); if(iter != m.end()) { ans.push_back(m[target-nums[i]]); ans.push_back(i); } m[nums[i]] = i; } return ans; } };