题目:
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
思路分析:
自然最简单的方法就是写两个嵌套循环,但是这样做效率太低,leetcode OJ并没有通过这种方法。既然时间效率太低,那我们就用空间换时间呗。
第一个思路是先排序,再做两个游标,从两头分别向中间递进。由于排序会导致原来的index改变,因此应在排序前为原数组建立一个副本。但是仔细想想这个方法虽然效率有所提高,但是仍然不是最好。
第二个思路是,为了提高查找的速度,我们可以利用hash表的方法,建立一个hash 表,数组里的数为key,其相应的index为value(注意,题目要求index从1开始)。代码如下:
1 vector<int> twoSum(vector<int>& nums, int target) { 2 vector<int> result; 3 unordered_map<int, int> nummap; 4 for (int i = 0; i<nums.size(); i++) 5 { 6 nummap[nums[i]] = i + 1; 7 } 8 for (int i = 0; i<nums.size(); i++) 9 { 10 if (nummap.count(target-nums[i])&&nummap[target-nums[i]] != i + 1) 11 { 12 if (i + 1<nummap[target-nums[i]]) 13 { 14 result.push_back(i + 1); 15 result.push_back(nummap[target-nums[i]]); 16 break; 17 18 } 19 else 20 { 21 result.push_back(nummap[target-nums[i]]); 22 result.push_back(i+1); 23 break; 24 } 25 26 } 27 } 28 return result; 29 }
这里需要注意的是,本方法使用了stl的unordered_map,其具体介绍可自行查询一下。另外,由于要求返回的结果,小的index要在前面插入,因此应判断一下。
最值得注意的是:nummap[target-nums[i]] != i + 1,这一句表示杜绝了返回两个相同的index,如[3,2,4],6的情况下,应返回(2,3)而不是(1,1)