您的位置:首页 > 其它

leetcode-1-two sum

2016-02-25 00:27 387 查看
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
/*
用暴力搜索就要O(n)或者至少是O(nlgn),似乎会超时。
如果用hash的话就能保证O(n),注意要保存元素的下标,
所以用unordered_map,还要注意两个下标要按从小到大
的顺序。
因为结果只可能有一对下标,所以相同的数字最多有两个,
由于存入unordered_map的时候相同数字的下标会覆盖,
所以比较下标的时候保险就是一个用nums的下标,一个用查找
unordered_map返回的下标。
*/
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> mymap;
vector<int> inds;
for (int i = 0; i < nums.size(); i++) {
mymap.insert(make_pair(nums[i], i));
}
for (int i = 0; i < nums.size(); i++) {
int gap = target - nums[i];
if (mymap.find(gap) != mymap.end()) {
if (i > mymap[gap]) {
inds.push_back(mymap[gap]);
inds.push_back(i);
break;
} else if (i < mymap[gap]){    //一定是两个不同的下标
inds.push_back(i);
inds.push_back(mymap[gap]);
break;
}
}
}
return inds;
}
};
int main(int argc, const char * argv[]) {
Solution s;
vector<int> n = {0,4,3,0};
vector<int> result = s.twoSum(n, 0);
for (int i = 0; i < result.size(); i++) {
cout << result[i] << " ";
}
cout << endl;
return 0;
}


更改(去重)

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> mymap;
vector<int> inds;
for (int i = 0; i < nums.size(); i++) {
mymap.insert(make_pair(nums[i], i));
}
for (int i = 0; i < nums.size(); i++) {
int gap = target - nums[i];
if (mymap.find(gap) != mymap.end()) {
if (i > mymap[gap]) {
inds.push_back(mymap[gap]);
inds.push_back(i);
break;
}
}
}
return inds;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: