解法一:时间复杂度O(n^2)
思路:依次遍历,使用目标减去当前target,再查找其差值是否存在于原始数组中。若存在,则返回当前i,j;若不存在,则继续遍历直到结束并返回空。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result(2);
if(nums.empty())
return result;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if(nums[j]==(target-nums[i])){
result[0]=i;
result[1]=j;
return result;
}
}
}
return result;
}
};
解法一:时间复杂度O(n)
反思:若没有其他方法,那么上述方法中是否存在可以优化的地方?
思路:有,查找元素这里是可以降低复杂度的。比如使用STL中的map,map中有两个比较著名的方法。用map主要是为了将值与位置相对应,从而可以直接通过差值直接查找到有没有和该差值相对应的值。若存在,则可以通过map得到和差值对应的位置;若不存在,则继续遍历。
注:考虑到时间复杂度,采用hashmap更佳
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> m;
for(int i = 0; i < nums.size(); i++){
if(m.find(target - nums[i]) != m.end()){
return {m[target-nums[i]], i};
}
m[nums[i]] = i;
}
return {};
}
};