要求
- 给出一个整型数组nums
- 返回这个数组中两个数字的索引值i和j
- 使得nums[i]+nums[j]等于一个给定的target值
- 两个索引不能相等
实例
- nums=[2,7,11,15], target=9
- 返回[0,1]
细节
- 索引从0还是从1开始计算
- 没有解怎么办
- 有多个解怎么办
思路
- 暴力解法(n2)
- 排序后,使用双索引对撞(nlogn+n=nlogn)
- 查找表,将所有元素放入查找表,对每一个元素a,查找target-a是否存在(n)
- 不要一次性将元素全部放入查找表中,相同元素会覆盖
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map<int,int> record; 5 for( int i = 0 ; i < nums.size() ; i ++ ){ 6 int complement = target - nums[i]; 7 if( record.find( complement ) != record.end() ){ 8 int res[2] = {i,record[complement]}; 9 return vector<int>(res, res+2); 10 } 11 record[nums[i]] = i; 12 } 13 throw invalid_argument("the input has no solution"); 14 } 15 };
相关
- 15 3Sum
- 18 4Sum
- 16 3Sum Closest