题目大意
在数组中找到 2 个数之和等于给定值的数字,结果返回 2 个数字在数组中的下标
解题思路
简单的解决方案是 O(n^2) 运行时复杂度。
foreach (item1 in array)
{foreach (item2 in array){if (item1 + item2 == target){return result}}
}
顺序扫描数组,对每一个元素,在 map 中找能组合给定值的另一半数字,如果找到了,直接返回 2 个数字的下标即可。如果找不到,就把这个数字存入 map 中,等待扫到“另一半”数字的时候,再取出来返回结果。
class Solution
{
public:vector<int> twoSum(vector<int>& numbers, int target) {unordered_map<int,int>m; vector<int> result;for(int i = 0;i < numbers.size();i++){// 没有找到第二个if(m.find(numbers[i]) == m.end()){// 将第一个位置存储到第二个的键中m[target - numbers[i]] = i;}else{找到第二个result.push_back(m[numbers[i]] + 1);result.push_back(i+1);break;}}return result;}
};
// 我们也可以将 nums[i] 存储到 map 中,并找到target - nums[i]
class Solution {
public: vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int>m;vector<int> result;for(int i = 0;i<nums.size();i++){if(m.find(target - nums[i]) == m.end()){m[nums[i]] = i;}else{result.push_back(m[target - nums[i]]);result.push_back(i);}}return result;}
};