给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
class Solution { public: vector<vector<int> > threeSum(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<vector<int> >res; int _size=nums.size(); if(_size<3||nums.front()>0||nums.back()<0) return res; int i,j,k; for(k=0;k<=_size-3;k++){ if(nums[k]>0) break; if(k>0&&nums[k]==nums[k-1]) continue; //跳过无意义移动 i=k+1;j=_size-1; while(i<j){ if(nums[i]+nums[j]+nums[k]>0) j--; else if(nums[i]+nums[j]+nums[k]<0) i++; else{ res.push_back({nums[i],nums[j],nums[k]}); while(i<j&&nums[i]==nums[i+1]) //跳过无意义移动 i++; while(i<j&&nums[j]==nums[j-1]) //同上 j--; i++; j--; //这里可以两边同时缩近,缩一边没啥用hahaha。 } } } return res; } };
四数之和 外层多了一个嵌套而已
for(k=0;k<s-3;k++) { if(k>0&&nums[k]==nums[k-1]) continue; for(l=k+1;l<s-2;l++) {if(l>k+1&&nums[l]==nums[l-1]) continue; i=l+1;j=s-1; while(j>i) { if(nums[i]+nums[j]+nums[k]+nums[l]<target) { i++; } else if(nums[i]+nums[j]+nums[k]+nums[l]>target) { j--; } else{ res.push_back({nums[i],nums[j],nums[k],nums[l]}); while(i<j&&nums[i]==nums[i+1]) { i++; } while(i<j&&nums[j]==nums[j-1]) { j--; } i++;j--; } }} }return res;