您的位置:首页 > 编程语言 > C语言/C++

【LeetCode 15】3Sum (C++)

2018-03-15 17:13 363 查看

Problem:

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.For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]


Solution:

这里题目意思容易弄错,所谓“unique triplets”是指在nums中的下标唯一,还是triplets本身的元素组合唯一,我最初理解为下标唯一,使用递归思想,且算法复杂度为 给出的代码如下Class Solution {
private:
vector<vector<int>> solution;

public:
void dp_find(int a,int b,int c,vector<int>& nums){
if(nums[a]+nums[b]+nums[c]==0&&a!=b&&a!=c&&b!=c){
vector<int> s;
s.push_back(nums[a]);
s.push_back(nums[b]);
s.push_back(nums[c]);
solution.push_back(s);
}else if(c==nums.size()-1){
return;
}else{
if(a==b){
dp_find(a,b+1,c+1,nums);
dp_find(a+1,b+1,c+1,nums);
}else if(b==c){
dp_find(a,b,c+1,nums);
dp_find(a,b+1,c+1,nums);
}else
dp_find(a,b,c+1,nums);
}
}

vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.size()<3);
else{
dp_find(0,0,0,nums);
}
return solution;
}
};提交该代码后发现题意理解错误,于是改为实现triplets本身的元素唯一,因为要保证triplets的唯一性,所以需要对nums进行排序,然后用分层用指针去查找,如下class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums){
vector<vector<int>> result;
std::sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
int target=-nums[i];
int l=i+1;
int h=nums.size()-1;
while(l<h){
int lh=nums[l]+nums[h];
if(lh<target)l++;
else if(lh>target)h--;
else{
vector<int> v(3,0);
v[0]=nums[i];
v[1]=nums[l];
v[2]=nums[h];
result.push_back(v);
while(l<h&&nums[l]==v[1])l++;
while(l<h&&nums[h]==v[2])h--;
}
}
while(i+1<nums.size()&&nums[i]==nums[i+1])i++;
}
return result;
}
};

Attention:

因为要保证triplets的唯一性,所以每找到一个triplets,都要对l和h指针接下来的轨迹进行去重检查
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Three Sum C leetcode