两数之和:link
1.题目分析
1.为了以O(n)的时间复杂度完成寻找,那么只能是遍历一遍或者多遍,而且在每个位置操作的时间复杂度是常数时间。
2.逆向思维,把找两个数转换成 ⟶ \longrightarrow ⟶查看每个数是否有与其相加之和满足条件的数
3.为了在常数时间内完成匹配查找,可以先遍历一遍预处理生成一个unordered_map<int, int> num2index
,数到数组下标的映射。因为把一个数和它前面的所有的数相互组合可以产生整个数组的两两组合的所有组合,所以可以遍历的同时生成这个unordered_map
.
2.代码示例
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> num2index;
for(int i = 0; i < nums.size(); ++i){
int other_num_needed = target - nums[i];
if(num2index.count(other_num_needed)){
return vector<int>{num2index[other_num_needed], i};
}
num2index[nums[i]] = i;
}
return vector<int>();
}
};