您的位置:首页 > 其它

leetcode Two Sum

2015-03-04 17:11 316 查看
PS:下面贴的这个代码是二分查找的那个,不是那个用map的我再写一遍吧。

map代码:

#include<map>
#include<iostream>
#include<vector>

using namespace std;

vector<int> TwoSum(vector<int> numbers, int target)
{
vector<int> result;
map<int, int> hmap;
for (int i = 0; i < numbers.size(); i++)
{
int x = target - numbers[i];
if (hmap.count(x) == 0)
{
hmap.insert(pair<int, int>(numbers[i], i));
}
else
{
int j = hmap[x];
result.push_back(j + 1);
result.push_back(i + 1);
return result;
}
}
return result;
}

int main()
{
vector<int> a = { 2, 7, 13, 4 };
vector<int> b = TwoSum(a, 9);
for (int i = 0; i < 2; i++)
{
cout << b[i] << "    ";
}
}


PS: STL真的很好用啊!!!!

本来这个题呢,是O(n2)但是试了一下,没过,这个在预期内!!然后想到了,查找target-a[i]这种方法,排序要O(nlgn),后来仔细一想,我还要保存排序前的的数组下表,而且这好像也不像算法OJ的考察方式吧。然后找了下答案,最后发现其实和我保存的方式差不多,只不过,别人利用map把search target-a[i] 的时间降到了O(1)时间,这就是用stl的好处。

二分查找代码:

class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
sort(numbers.begin(),numbers.end());
int size = numbers.size();
vector<int> result;
for (int i = 0; i < size; i++)
{
int t = target - numbers[i];
int p = i + 1;
int r = size - 1;
int q = (p+r) / 2;
int j = i;
while (p <= r)
{
if (numbers[q] == t)
{
j = q;
break;
}
if (t<numbers[q])
{
r = q - 1;
q = (p + r) / 2;
}
else
{
p = q + 1;
q = (p + r) / 2;
}
}
if (j > i)
{
result.push_back(i + 1);
result.push_back(j + 1);
return result;
}
}
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: