计算机低能儿从0刷leetcode | 18.四数之和

题目:18. 四数之和

解答:经过前面几题的练习,这道题比较容易做出来(在不考虑优化的前提下)

主要思路就是在之前“三数之和”的基础上再套一个for循环,即每次先固定一个数nums[i],然后从nums[i+1](用nums[j]表示)开始与之组合,即为寻找nums[j] + nums[l] + nums[r] = target - nums[i]的三元组。

思路不难,比较麻烦的是去重操作。

对于nums[i] :  while(i>0&&nums[i]==nums[i-1]&&i<=nums.size()-4)    i++;

对于nums[j] : while(j-1!=i&&nums[j]==nums[j-1]&&j<=nums.size()-3)  j++;

对于左右指针,是和之前完全一样的去重方法:        while(l<r&&nums[l]==nums[l+1]) l++;

                                                                                    while(l<r&&nums[r]==nums[r-1]) r--;

代码如下:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
         vector <vector <int>>res;
         sort(nums.begin(), nums.end());
         cout<<nums[0];
         if(nums.size()<4) return res;
         for(int i=0;i<=nums.size()-4;i++){
           while(i>0&&nums[i]==nums[i-1]&&i<=nums.size()-4) i++;//去重
            for(int j=i+1;j<=nums.size()-3;j++){
                 while(j-1!=i&&nums[j]==nums[j-1]&&j<=nums.size()-3) j++;//去重
                 int l=j+1,r=nums.size()-1;
                 while(l<r){
                    long long int sum=nums[j]+nums[l]+nums[r];
                    if(sum==target-nums[i]){
                        vector<int> temp;
                        temp.push_back(nums[i]);
                        temp.push_back(nums[j]);
                        temp.push_back(nums[l]);
                        temp.push_back(nums[r]);
                        res.push_back(temp);
                        while(l<r&&nums[l]==nums[l+1]) l++;//去重
                        while(l<r&&nums[r]==nums[r-1]) r--;//去重
                        l++;r--;
                    }
                    if(sum<target-nums[i]){
                        l++;
                    }
                    if(sum>target-nums[i]){
                        r--;
                    }
                 }
            }
         }
         return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我哋每一个人都要ga油啊

您的鼓励是支持我继续的极大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值