您的位置:首页 > 其它

1. Two Sum

2015-06-30 20:14 351 查看
这道题,总的来说,共有两种解法。一种解法是双指针扫描,向中间进行夹逼。时间复杂度为O(nlogn)。但是为了保存下标,需要加个结构体,所以还是挺麻烦的,代码如下:

vector<int> twoSum(vector<int>& nums, int target) {
int len = (int)nums.size(), i, sum;
vector<int> result;
num_pos mapping[len];
for (i=0; i<len; i++) {
mapping[i].num = nums[i];
mapping[i].pos = i+1;
}
qsort(mapping, len, sizeof(mapping[0]), cmp);
int p = 0, q = len-1;
while (p < q) {
sum = mapping[p].num + mapping[q].num;
if (sum > target) {
q--;
} else if (sum < target) {
p++;
} else {
if (mapping[p].pos < mapping[q].pos) {
result.push_back(mapping[p].pos);
result.push_back(mapping[q].pos);
} else {
result.push_back(mapping[q].pos);
result.push_back(mapping[p].pos);

}
break;
}
}
return result;

}
另外一种解法是利用Map。C++中的Map是利用红黑树实现的,搜索效率为O(logN)。利用Map的算法思想如下:遍历vector,当下标为i时,我们检测nums[i]是否可以在remain_index中找到,如果找到,break。找不到,就把target-nums[i]放到remain_index中,代码如下:

vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> remain_index;
vector<int> result;
int len = (int)nums.size();

for (int i = 0; i < len; i++) {
if (remain_index.find(nums[i]) != remain_index.end()) { // 找到了
int index =remain_index[nums[i]];
result.push_back(index+1);
result.push_back(i+1);
break;
} else {
remain_index[target-nums[i]] = i; // 找不到
}
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: