1.三数之和
· 要求是找数组中和为0的三个数,那么有三个数,就先固定一个数,我们把数组排序之后,以左边第一个数固定,为三数中的最小者,下来 我们需要明白一个原理,就是对于排序数组,两数之和可以从两头来计算,若大了则减小右数,若小了则增大左数,直到左右两端碰头为止
(1)先检查数组长度,是否够3
(2)后排序 sort
(3)循环判断
注意1:sort函数的参数是两个或者三个 (1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址的下一地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序
自定义函数来决定排序方式
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int s=nums.size();
vector<vector<int>> sum;
if(s<3){ return sum;}
sort(nums.begin(),nums.end());
for(int i=0;i<s-2;i++){
if(i>0 && nums[i]==nums[i-1]){
continue;
}
int l=i+1;
int r=s-1;
while(l<r){
if(nums[i]+nums[l]+nums[r]==0){
sum.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(nums[i]+nums[l]+nums[r]<0){
l++;
}
else{
r--;
}
}}
return sum;
}
};
2.四数之和
√ 自
其实主要思路就是在三数之和的基础上外加一层循环
注意1 外加循环后 外循环的避免重复没问题
if(i>0&&nums[i]==nums[i-1]){continue;}
但是内循环要在不是与第一个数连续的情况下 避免重复 例如 -5,-2,-1,0,2,2,4,4
2244也可以
if(j>i+1 &&nums[j]==nums[j-1]){continue;}
四数之和代码 自
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>>res;
int length=nums.size();
if(length<4){return res;}
sort(nums.begin(),nums.end());
for(int i=0;i<length;i++){
if(i>0&&nums[i]==nums[i-1]){continue;}
for(int j=i+1;j<length;j++){
int l=j+1;
int r=length-1;
if(j>i+1 &&nums[j]==nums[j-1]){continue;}
while(l<r){
int sum=nums[i]+nums[j]+nums[l]+nums[r];
if(sum==target){
res.push_back({nums[i],nums[j],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<target){
l++;
}
else{
r--;
}
}
}
}
return res;
}
};