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;
    }
};
相关推荐
_Coin_-1 小时前
算法训练营DAY27 第八章 贪心算法 part01
算法·贪心算法
许小燚5 小时前
线性表——双向链表
数据结构·链表
董董灿是个攻城狮5 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki5 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
qqxhb7 小时前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
晚云与城8 小时前
【数据结构】顺序表和链表
数据结构·链表
FirstFrost --sy9 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
森焱森9 小时前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
搂鱼1145149 小时前
(倍增)洛谷 P1613 跑路/P4155 国旗计划
算法
Yingye Zhu(HPXXZYY)9 小时前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法