
分析:
解法一:最容易想到的暴力搜索,两个循环。
时间复杂度:O(n^2)
解法二:在解法一的基础上优化一些,比如可以用两个指针(head 、tail)从前后往中间搜索。
时间复杂度:O(nlogn)
解法三:用hashmap
时间复杂度:O(n)
C++实现解法三
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
unordered_map<int,int> mymap;
int res;
for(int i = 0;i < nums.size();i++)
{
res = target - nums[i];
unordered_map<int,int>::iterator it = mymap.find(res);
if(it != mymap.end())
{
return vector<int>({it->second,i});
}
mymap[nums[i]] = i;
}
}
};
魔法
这道题形式是a+b=target(a,b未知),在写程序的时候不要限于a+b=target这种形式,换一下式子:
b=target-a
这样在搜索的时候,思考的方式会不一样,程序就变成了,搜索某个值==target。
即:a+b=target -->b=target-a
网友评论