您的位置:首页 > 其它

【LeetCode】15. 3Sum

2017-02-28 16:55 197 查看

【LeetCode】15. 3Sum

【题目描述】

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets
in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

【输入输出】



【解题思路】

  1. 本题与Two Sum类似,只是由两个数的和拓展为三个数的和,其中一个区别是,Two Sum要求返回下标而本题要求返回值,这意味着可对vector进行排序。
  2. 去重:去除重复的元素,降低vector大小,此时注意a+a+b=0的情况,在去除重复元素的同时,若存在nums[i]=-2a时,应将[a, a, b]压入ans中,同时若存在三个或以上的零时也要将其压入ans。
  3. 遍历:令i = [0, nums.size() - 3], from = i + 1, to = nums.size() - 1, 当from < to时,计算nums[i] + nums[from] + nums[to]的值,若等于零,将[nums[i], nums[from], nums[i]]压入ans, 若大于零,from++, 若小于零,to--,以此类推。
  4. 进一步优化: 当nums[to] <0或者nums[i] > 0时可直接跳出当前循环。

【代码】

class Solution {
public:
vector<vector<int>> ans;
vector<vector<int>> threeSum(vector<int>& nums) {
ans.clear();
sort(nums.begin(), nums.end());

int lastN = INT_MAX, zeroC = 1;
bool flag = true;
for (vector<int>::iterator ite = nums.begin(); ite != nums.end();) {
if (*ite == lastN) {
ite = nums.erase(ite);
if (lastN == 0) {
zeroC++;
continue;
}
vector<int>::iterator iter = find(nums.begin(), nums.end(), -2 * lastN);
if (iter != nums.end() && flag) {
if (lastN >= 0) {
vector<int> node;
node.push_back(*iter);
node.push_back(lastN);
node.push_back(lastN);
ans.push_back(node);
}
else {
vector<int> node;
node.push_back(lastN);
node.push_back(lastN);
node.push_back(*iter);
ans.push_back(node);
}
flag = false;
}
}
else {
lastN = *ite;
ite++;
flag = true;
}
}
if (zeroC >= 3) {
vector<int> node;
node.push_back(0);
node.push_back(0);
node.push_back(0);
ans.push_back(node);
}
if (nums.size() <= 2) return ans;
for (int i = 0; i < nums.size() - 2 && nums[i] < 0; i++) {
int from = i + 1;
int to = nums.size() - 1;
while (from < to && nums[to] > 0) {
if (nums[from] + nums[to] + nums[i] > 0) to--;
else if (nums[from] + nums[to] + nums[i] < 0) from++;
else {
vector<int> node;
node.push_back(nums[i]);
node.push_back(nums[from]);
node.push_back(nums[to]);
ans.push_back(node);
from++;
to--;
}
}
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode