Leetcode每日刷题之18.四数之和

1.题目解析

这里的18.四数之和与之前的三数之和有着异曲同工之妙,所以建议看完三数之和再来看本题,详细题目见Leetcode每日刷题之15.三数之和 ,只不过这里需要寻找的是四元组,也是不能寻找重复的四元组并且四元组内的数字可以按照任意顺序返回

2.算法原理

关于四数之和的思路是首先固定一个数 a,这时利用三数之和的思路找出符合三个数之和为target - a ,在后续的数组范围内固定另一个数 b,然后使用双指针找出符合两数之和为 target - a - b 的二元组即可,然后对双指针找出的二元组去重,再对数字 b 去重,最后对数字 a 去重即可

3.代码展示

cpp 复制代码
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        //1.创建二维数存储数据
        vector<vector<int>> vv;
        
        //2.排序数组数据
        sort(nums.begin(),nums.end());

        int n = nums.size();
        //固定数 a
        for(int i = 0;i < n; )
        {
            //固定数 b
            for(int j = i + 1;j < n; )
            {
                int left = j + 1;
                int right = n - 1;
                long long aim = (long long)target - nums[i] - nums[j];
                while(left < right)
                {
                    int sum = nums[left] + nums[right];
                    if(sum < aim)
                    {
                        left++;
                    }
                    else if(sum > aim)
                    {
                        right--;
                    }
                    else
                    {
                        vv.push_back({nums[i],nums[j],nums[left],nums[right]});
                        //去重双指针找到的二元组
                        right--;
                        left++;
                        while(left < right && nums[right] == nums[right + 1])
                        {
                            right--;
                        }
                        while(left < right && nums[left] == nums[left - 1])
                        {
                            left++;
                        }
                    }
                }
                //去重 b
                j++;
                while(j < n && nums[j] == nums[j - 1])
                {
                    j++;
                }
            }
            //去重 a
            i++;
            while(i < n && nums[i] == nums[i - 1])
            {
                i++;
            }
        }
        return vv;
    }
};
相关推荐
近津薪荼13 小时前
优选算法——双指针专题7(单调性)
c++·学习·算法
j4455661113 小时前
C++中的职责链模式实战
开发语言·c++·算法
m0_6860416113 小时前
实时数据流处理
开发语言·c++·算法
波波侠813 小时前
代码随想录算法训练营打卡第31天|56. 合并区间、738.单调递增的数字
算法
Snow_day.13 小时前
有关线段树应用(1)
数据结构·算法·贪心算法·动态规划·图论
m0_5613596714 小时前
C++模块接口设计
开发语言·c++·算法
wengqidaifeng14 小时前
探索数据结构(二):空间复杂度
c语言·开发语言·数据结构
难得的我们14 小时前
单元测试在C++项目中的实践
开发语言·c++·算法
Once_day14 小时前
代码训练总结(1)算法和数据结构的框架思维
数据结构·算法
鹿角片ljp14 小时前
力扣125.验证回文串-双指针
数据结构·算法