您的位置:首页 > 其它

LeetCode----Two Sum

2017-02-26 22:36 691 查看
很久没有做过算法题了,脑子也不太好用了,趁着算法课的机会学习一下,这周选了最简单的第一题来做。
LeetCode Two Sum,题目如下所示:

由于一开始也没有特别多的思路,秉承着先做到再做好的信仰,用了两种方法:
(1)一开始使用了最暴力的方法,也就是使用两个循环,显然O(N2)的时间复杂度使得算法超时了。
(2)先对数组进行排序,由于排序会使位置发生改变,因此使用结构体记录下数值和位置,并使用两个指针一前一后进行遍,这样时间复杂度就降为了O(NlogN)
  AC的代码如下:
struct Num {
int val, pos;
};

bool cmp(Num a, Num b) {
return a.val < b.val;
}
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {

vector<int> result;
vector<Num> Numbers;
for (int i = 0; i < nums.size(); i++) {
Num temp;
temp.val = nums[i];
temp.pos = i;
Numbers.push_back(temp);
}

sort(Numbers.begin(), Numbers.end(), cmp);

for (int i = 0, j = Numbers.size() - 1; i != j;) {
int sum = Numbers[i].val + Numbers[j].val;
if (sum == target) {
if (Numbers[i].pos < Numbers[j].pos) {
result.push_back(Numbers[i].pos);
result.push_back(Numbers[j].pos);
}
else {
result.push_back(Numbers[j].pos);
result.push_back(Numbers[i].pos);
}
break;
}
else if (sum < target)
i++;
else if (sum > target)
j--;
}
return result;
}
};
看了讨论还有时间复杂度为O(N)的算法,改天自己试试。
太久没做类似的题目了,感觉自己非常弱,就在解决这道非常简单的题目的过程中,很多基本的语法和一些基本的考虑都没做到,要加把劲了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: