本文最后更新于 76 天前,其中的信息可能已经有所发展或是发生改变。
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = [ ]
输出:[ ]
示例 3:
输入:nums = [0]
输出:[ ]
提示:
0 <= nums.length <= 3000
-10^5<= nums[i] <= 10^5
nums数组的长度是3000,如果我们用三层循环遍历,时间复杂度o(n^3),那么肯定会超时
我们可以利用双指针来减少时间复杂度
我们可以依次遍历数组,然后用两个指针来维护,左指针从i+1开始,右指针从n-1开始,如果sum>0 l++,否则r++;但是题目要求不能重复,我们要注意去重
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
if(n<3) return ans;
for(int i=0;i<n-2;i++){
if(i>0 && nums[i]==nums[i-1]) continue;
int l = i+1, r = n-1;
while(l<r){
int sum = nums[i]+nums[l]+nums[r];
if(sum == 0){
ans.push_back({nums[i],nums[l],nums[r]});
while(l<r && nums[l]==nums[l+1]) l++;
while(l<r && nums[r]==nums[r-1]) r--;
l++,r--;
}
else if(sum>0) r--;
else l++;
}
}
return ans;
}
};