题目:
给定一个整数数列,找出其中和为特定值的那两个数。
你可以假设每个输入都只会有一种答案,同样的元素不能被重用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
分析:
flag用于标记是否找到结果,双重for循环寻找目标,且i不等于j,并且i+j等于target。此方法时间复杂度比较高,为O(n2).
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> a;
int flag=0;
for(int i=0;i<nums.size();i++){
if(flag)
break;
for(int j=0;j<nums.size();j++){
if(i!=j && (nums[i]+nums[j] == target)){
a.push_back(i);
a.push_back(j);
flag=1;
break;
}
}
}
return a;
}
};
运用MAP,可以更加高效
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> a;//无序图,由哈希算法实现(元素不可重复),键为数组元素的值,值为数组的下标
vector<int> b;
for (int i = 0; i < nums.size(); ++i) {
if (a.count(target - nums[i])) {//count统计次数,有是1,无则0
b.push_back(a[target - nums[i]]);//插入返回的数组中,顺序也可以颠倒
b.push_back(i);
return b;
//以上三句可简化为 return {a[target-nums[i]],i};
//这样一来就不用定义b数组了,看起来可以简短一点
}
a[nums[i]] = i;
}
return b;
}
};