首页 > 其他分享 >Leetcode每日刷题之18.四数之和

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

时间:2024-08-18 21:56:37浏览次数:10  
标签:四数 nums ++ 18 int while right Leetcode left

1.题目解析

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

2.算法原理

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

3.代码展示

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

 

 

标签:四数,nums,++,18,int,while,right,Leetcode,left
From: https://blog.csdn.net/2301_80689220/article/details/141305852

相关文章

  • (附论文)基于Springboot和Vue的社区养老服务平台管理系统(187)
    获取源码请滑到最底部访问官网项目配套调试视频和相对应的软件安装包1、项目描述具体请看视频演示2、项目开发工具开发工具:Idea或Eclipse数据库:MysqlJar包仓库:Maven前端框架:Vue后端框架:Springboot3、项目图片4、演示视频(附论文)基于Springboot和Vue的社区养老......
  • (附论文)基于Springboot和Vue的校园商铺管理系统(188)
    获取源码请滑到最底部访问官网项目配套调试视频和相对应的软件安装包1、项目描述本次开发的校园商铺管理系统实现了收货地址管理、购物车管理、字典管理、公告信息管理、商家管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。具体请......
  • 2024.8.18 鲜花
    鱼,好大的鱼,虎纹鲨鱼回リ続ける歯车には成リ下がらない平均演じる诞生から始まった地狱游び半分で神が导いた盤上の世界NONONOGAMENOLIFEぬるい平穏をばっさリ切リ舍てて栄光への阶段に存在刻むんだ目に映るのは完全胜利の运命何もかも计算どおり変えて......
  • 2024.8.18 周总结(上周天到这周六集训,这周天放假)
    感觉这一周上难度了,尤其没听懂的是二分图和博弈论那天上午休息完之后的部分。有复习,有新知识,收获还是比较大的。晚上打游戏打多了。文化课没学多少。中午看番、玩寝室楼下桌上的游戏去了,因为寝室要关灯拉窗帘睡得也更早,一周就只写了一点点字帖,看了一点点《乡土中国》。综......
  • AIGC时代算法工程师的面试秘籍(第二十式2024.8.5-8.18) |【三年面试五年模拟】
    写在前面【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法,力求让读者在获得心仪offer的同时,增强技术基本面。也欢迎大家提出宝贵的优化建议,一起交流学习......
  • LeetCode 556. 下一个更大元素 III(next_permutation())
    题目:556.下一个更大元素III思路:用到next_permutation(),细节看注释。next_permutation、prev_permutationclassSolution{public:intnextGreaterElement(intn){ //转变为string类型,便于调用next_permutation()strings=to_string(n);......
  • 【代码随想录训练营第42期 Day32打卡 - 从零开始动态规划 - LeetCode 509. 斐波那契数
    目录一、做题心得二、动规五步走三、题目与题解题目一:509.斐波那契数题目链接题解1:记忆性递归 题解2:动态规划题目二:70.爬楼梯 题目链接题解:动态规划题目三:746.使用最小花费爬楼梯题目链接题解:动态规划三、小结一、做题心得今天开始动态规划章节的第一......
  • (nice!!!)LeetCode 552. 学生出勤记录 II(动态规划dp递归版、记忆化dfs)
    题目:552.学生出勤记录II思路:记忆化搜索dfs,细节看注释classSolution{public:constintmod=1e9+7;//状态f[u][a][b]表示:在选择第u个位置前,缺勤次数为a次,且当前连续迟到次数为b次时,可以得到的合法出勤次数intf[100010][5][5];intdfs(intu,int......
  • 对象流,序列化和反序列化 day18
    packagecom.shujia.day18.ketang;importjava.io.*;/*序列化流:序列化:将一个对象转换成网络中传输的流对象输出流:ObjectOutputStream将一个类的对象写进文本中反序列化:将网络中传输的流还原成一个对象对象输入流:Object......
  • leetcode 49.字母异位词分组
    leetcode49.字母异位词分组题干给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["nat",&......