Leetcode #15: 3sum——避免重复
Leetcode #15: 3sum -- avoiding duplicate
问题说明:
给定一个包含n个整数的数组S, S中是否存在元素a, b, c使得a + b + c = 0?在数组中找到所有唯一的和为0的三元组
注意:解集不能包含重复的三元组。
例如,给定数组S = [-1, 0, 1, 2, -1, -4]
解集是:[[1,0,1],[1,2]]
下面是我的算法,工作合理,如预期的那样,但我不知道如何防止重复。我已经注释了我试图跟踪重复集合(三元组)的部分。
vector<vector<int>> threeSum(vector<int>& nums)
{
vector< vector<int> > res;
int a,b,c,start,end;
int preva=0,prevb=0,prevc=0; //variables to track elements of
//triplet pushed into result
//vector the previous run.
sort(nums.begin(),nums.end());
int n=nums.size();
for(int i=0; i<=n-3;i++){
a = nums[i];
start = i+1;
end = n-1;
while (start < end){
b = nums[start];
c = nums[end];
if (a+b+c == 0)
{
if ((a!=preva)&&(b!=prevb)&&(c!=prevc)) //check if duplicate
res.push_back({a,b,c}); //add triplet
//to res vector if not
//present.
end = end - 1;
preva=a;
prevb=b;
prevc=c;
}
else if (a+b+c > 0)
end = end - 1;
else
start = start + 1;
}
}
return res;
}
,
你的答案:[[-1,-1,2]]
与
不匹配期望答案:[[-1,-1,2],[-1,0,1]]
我错过了添加[-1,0,1]完全当它应该被添加到向量只有一次
考虑以下if
语句中的条件表达式:
if ((a!=preva)&&(b!=prevb)&&(c!=prevc)) //check if duplicate
这将只在a,b,c
不匹配preva,prevb,prevc
时推入结果;在[-1,0,1]
的情况下,我们最终得到a = -1
与[-1,-1,2]
匹配的preva = -1
。此外,这只检查前面的解决方案。
std::set
而不是vector
?
相关文章:
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- LeetCode 1011.Binary Search,C++和Python的想法相同,但输出不同
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 二叉树级别顺序遍历在leetcode中
- LeetCode 删除 c++ 中的重复项
- Leetcode 1366:堆缓冲区溢出
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- Leetcode 540 上的运行时错误.排序数组中的单个元素
- 运行时错误地址清理器:LEETCODE 中的致命信号
- Leetcode 297 序列化和反序列化二叉树
- Leetcode C++用于循环条件
- 我在LeetCode练习时遇到了一些奇怪的错误
- 我不明白关于 LeetCode 上的格雷码的解决方案
- DFS + 记忆解决方案在 LeetCode 上获取 TLE
- 我对 leetcode 72 上的递归方法感到茫然
- 3sum LTE at leetcode
- Leetcode #15: 3sum——避免重复