标签:sum 重复 lang 利用 不可 不重复 etc end public
题意:给你一个包含 \(n\) 个整数的数组?\(nums\),判断?\(nums\)?中是否存在三个元素 \(a,b,c\) ,使得?\(a + b + c = 0\),请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题目等价于求 \(a + b = -c\), 将数组从小到大排序,然后枚举 \(c\) 的值, 最后利用 双指针 算法 \(O(n)\) 求出满足等式的元组。总时间复杂度 \(O(n^2)\).
需要注意的是,题目要求 元组不能重复, 这是本道题目最关键的点。为了解决这个问题,我们可以:
对于这些限制条件,很容易在双指针算法上实现,具体看代码吧。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
int cnt = 0;
for (int k = 0; k < n; ++ k)
{
if (k > 0 && nums[k] == nums[k - 1]) continue;
int x = -nums[k];
for (int i = k + 1, j = n - 1; i < n; ++ i)
{
if (i > k + 1 && nums[i] == nums[i - 1]) continue;
while (j > i && nums[i] + nums[j] > x) j --;
if (j <= i) break;
if (nums[i] + nums[j] == x)
{
vector<int> tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[j]);
tmp.push_back(-x);
ans.push_back(tmp);
}
}
}
return ans;
}
};
标签:sum 重复 lang 利用 不可 不重复 etc end public
原文地址:https://www.cnblogs.com/niyada/p/12683424.html