LeetCode 20191108

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;
    }

};

发布了44 篇原创文章 · 获赞 9 · 访问量 3376

猜你喜欢

转载自blog.csdn.net/puying1/article/details/102895616