【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指针接下来的轨迹进行去重检查相关文章推荐
- LeetCode 15 — 3Sum(C++ Java Python)
- 【Leetcode 15】3Sum 三数和问题 C++
- leetcode: 15. 3Sum
- LeetCode-15:3Sum
- 3Sum - LeetCode 15
- leetcode(15). 3Sum
- Leetcode: 15. 3Sum 三数之和
- [Leetcode] 15. 3Sum 解题报告
- leetcode15: 3Sum
- leetcode-15 3Sum
- 【一天一道LeetCode】#15 3Sum
- LeetCode(15) 3Sum
- LeetCode15 3sum
- leetcode15 3sum
- LeetCode 15 3Sum (C,C++,Java,Python)
- LeetCode 15---3Sum
- leetcode15 3Sum
- LeetCode(15)3Sum
- leetcode15:3Sum
- LeetCode-15-3Sum(证明/KSum)-Medium