更新:
简直弱爆了。LeetCode上看了下别人的代码。基本都是O(N)的复杂度,基本都用到hashmap。
下面的代码个人觉得是最精妙优雅的。
线性扫描数组,查找hashmap中是否有key符合要求。如果有则可以返回结果了,如果没有则把当前元素加入到hashmap中。
而且很好地解决了重复元素的问题。 这个解法对于两个元素之和,特别有针对性。想法特别好。。
之前就一直说不要认为自己的solution被Accepted就把题目过掉。去LeetCode上看看,一定会有更好的solution的。
这里更好指的是 时间/空间复杂度更好或者代码更简洁优雅。
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
unordered_map<int,int> m;
unordered_map<int,int>::iterator it;
for(int i=0;i<numbers.size();++i){
it = m.find(target-numbers[i]);
if(it!=m.end()){
vector<int> res(2);
res[0] = it->second;
res[1] = i+1;
return res;
}
else
m[numbers[i]] = i+1;
}
return vector<int>();
}
};
先排序,再两头向中间扫描。
只能对拷贝排序,因为要求返回原始数组的下标。
复杂度O(nlogn)
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> tmp = numbers;
sort(tmp.begin(),tmp.end());
vector<int> res;
int i = 0, j = tmp.size()-1;
int num1, num2;
while(i<j){
int val = tmp[i]+tmp[j];
if(val==target){
num1 = tmp[i];
num2 = tmp[j];
break;
}
if(val<target)
++i;
else
--j;
}
for(int i=0;i<numbers.size();++i){
if(res.size()==2)
return res;
if(numbers[i]==num1 || numbers[i]==num2)
res.push_back(i+1);
}
}
};