Leetcode15 三数之和
Posted niyada
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode15 三数之和相关的知识,希望对你有一定的参考价值。
题目链接
题意:给你一个包含 (n) 个整数的数组?(nums),判断?(nums)?中是否存在三个元素 (a,b,c) ,使得?(a + b + c = 0),请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
思路:
题目等价于求 (a + b = -c), 将数组从小到大排序,然后枚举 (c) 的值, 最后利用 双指针 算法 (O(n)) 求出满足等式的元组。总时间复杂度 (O(n^2)).
需要注意的是,题目要求 元组不能重复, 这是本道题目最关键的点。为了解决这个问题,我们可以:
- 先不重复地枚举 (c) 的值;
- 其次不重复地枚举 (a) 的值;
- 最后在 (a) 之后的区间寻找 (b) 的值;
对于这些限制条件,很容易在双指针算法上实现,具体看代码吧。
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;
}
};
以上是关于Leetcode15 三数之和的主要内容,如果未能解决你的问题,请参考以下文章