1. Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
分析
- 最直接的暴力解决,但速度慢
- 使用哈希表,用于记录每个数对应的下标,复杂度O(n)
- 如果返回的不是下标,则还可以先排序然后使用两边夹逼方式寻找;但本题要寻找下标,所以这个方法行不通
源码
暴力解决
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ret;
for(vector<int>::const_iterator it = nums.begin(); it < nums.end(); it++) {
for(vector<int>::const_iterator inner = it + 1; inner < nums.end(); inner++) {
if (target == (*it + *inner)) {
ret.push_back(it - nums.begin());
ret.push_back(inner - nums.begin());
break;
}
}
}
return ret;
}
使用哈希表
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ret;
unordered_map<int,int> mapper;
for(int i = 0; i < nums.size(); i++) { // 遍历原数组
mapper[nums[i]] = i;
// [0,4,3,3] target = 6
int gap = target - nums[i];
// mapper[gap] > i 肯定是要往比索引i大的方向查找 比如[3,2,4] target = 6
// 如果不加入这个条件限制,就会返回[0,0],因为6-3=3,而3在哈希表里,不能是自己了
if(mapper.find(gap) != mapper.end() && mapper[gap] > i) {
ret.push_back(i);
ret.push_back(mapper[gap]);
break;
}
}
return ret;
}