(1)Two Sum | LeetCode
题目:给定一个整数数组,返回可以达到特定和的两个数字下标。假定每个输入都会确切地有一个解决方案,但无法使用两次相同的数字。
例如:所给数组 = [2, 7, 11, 15], 和(target) = 9, 那么因为0位和1位相加等于 2 + 7 = 9,所以返回 [0, 1]
最开始的思路是直接寻找两个数的和等于和数,但是在两层循环的情况下,最差的情况是n^2,导致了超时的问题,所以一种想法是使用map的方式,将数组每一个元素的数值和下标放入map中,为了达到时间最短的情况,在放入的过程中,查询求和,也就是找到和数减去一个数的另一个数是否在map中。
于是有了以下的代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> m;
for(int i = 0; i < nums.size(); i ++){
int n;
if(!m.count(nums[i])){
m.insert(pair<int, int>(nums[i], i));
}
if(m.count(target - nums[i])){
n = m[target - nums[i]];
if( n < i ){
vector<int> a;
a.push_back(n);
a.push_back(i);
return a;
}
}
}
}
};
这样就完成了对两个数字的查找,先找到的是未输入的后一个数,然后找前面的第一个数是否已经放在map中,然后选择继续查找还是返回下标。