[刷题] 1 Two Sum

要求

  • 给出一个整型数组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)
  • 不要一次性将元素全部放入查找表中,相同元素会覆盖

 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 };
View Code

相关

  • 15 3Sum
  • 18 4Sum
  • 16 3Sum Closest
原文地址:https://www.cnblogs.com/cxc1357/p/12610268.html