1.两数之和
1.暴力法
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int>result; 5 for(int i=0;i<nums.size();i++) 6 for(int j=i+1;j<nums.size();j++) 7 if(nums[i]+nums[j]==target){ 8 result.push_back(i); 9 result.push_back(j); 10 return result; 11 } 12 return result; 13 } 14 };
2.哈希表
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int>result; 5 map<int,int>tmpmap; 6 for(int i=0;i<nums.size();i++) 7 tmpmap[nums[i]]=i; 8 for(int i=0;i<nums.size();i++){ 9 if(tmpmap.count(target-nums[i])!=0&&tmpmap[target-nums[i]]!=i){ 10 result.push_back(i); 11 result.push_back(tmpmap[target-nums[i]]); 12 break; 13 } 14 } 15 return result; 16 } 17 };
注:map的count用法:返回被查找元素的个数,如果有,返回1,否则,返回0。
3.双指针法
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> res; vector<int> temp; temp = nums; int n = nums.size(); int i=0,j=n-1; sort(temp.begin(),temp.end()); while(i<j){ if(temp[i] + temp[j] < target) i++; else if(temp[i] + temp[j] > target) j--; else break; } if(i < j){ for(int k=0;k<n;k++){ if(i < n && nums[k] == temp[i]){ res.push_back(k); i = n; } else if(j < n && nums[k] == temp[j]){ // 注意这个else,不加的话表示可以重复使用元素 res.push_back(k); j = n; } if(i == n && j == n) return res; } } return res; } };