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;
    }
};
相关推荐
漫随流水4 分钟前
leetcode算法(559.N叉树的最大深度)
数据结构·算法·leetcode·二叉树
池塘的蜗牛5 分钟前
NR PDSCH和CSI 正交导频设计
算法
CoovallyAIHub40 分钟前
仅192万参数的目标检测模型,Micro-YOLO如何做到目标检测精度与效率兼得
深度学习·算法·计算机视觉
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章10-中值滤波
图像处理·人工智能·opencv·算法·计算机视觉
爱编程的小吴1 小时前
【力扣练习题】151. 反转字符串中的单词
java·算法·leetcode
3***g2051 小时前
MATLAB高效算法设计原则利用MATLAB内置函数
开发语言·算法·matlab
雍凉明月夜1 小时前
深度学习之目标检测yolo算法Ⅰ(v1-v3)
深度学习·算法·yolo·目标检测
s09071361 小时前
【计算机视觉】详解立体匹配算法:原理、公式与核心策略
人工智能·算法·计算机视觉·立体匹配
MicroTech20251 小时前
MLGO微算法科技通过高阶方法和重新缩放进一步改进非线性微分方程的量子算法
科技·算法