力扣精选算法100题——四数之和(双指针专题)

这篇具有很好参考价值的文章主要介绍了力扣精选算法100题——四数之和(双指针专题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇讲到(俩数之和and三数之和)这一篇我要来解析四数之和,四数之和建立在三数之和的基础上,我们需要熟练掌握三数之和的算法原理,如果大家三数之和还没弄清楚,请点击三数之和and二数之和链接即可看到。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

 三数之和和四数之和的题意其实都一样。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

第一步:了解题意

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

找到出四个数之和等于target即可,但是下标不能相同,且是不重复的四元组,比如[-2,0,0,2]和[-2,2,0,0]是一样的,所以也告诉我们需要去掉重复值的。

第二步:算法原理

首先先排序 sort函数进行排成降序

还是和三数之和的算法原理相似

👉1.先固定一个a值

👉2.在a后面的区间内,利用"三数之和“算法思路找到三个数,使这三个数的和等于target-a;

       这里的"三数之和"指的是什么呢?——就是利用三数之和的算法原理。

        🎈1.固定一个b值

        🎈2.在b后面的区间内,利用”双指针“算法,快速找到2个数和为target-a-b;

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

所以我们可以根据算法原理知道和三数之和的代码雷同,但是不一样的地方是这里需要固定2个值。所以就对一些地方进行改进即可。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

根据”三数之和“的算法分析,这里也是需要去重防止漏值的。

❗去重

🚩left和right去重

首先[left,right]区间内,我们看到如果left到达-2,right到达2的位置。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法我们可以在这里对Left和right的值进行判断去重,如果相等就Left++,right--,直到遇到与上一个值不相等的就继续进行。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

 🚩固定a和b值

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

我们看到a的值前面一个值1和现在的值是一样的,b的值前面一个值0和现在的值是一样的,所以我们这里也是需要去重的。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

所以[left,right]和固定a,固定三者的去重是缺一不可的,因为题意说明不能取重复的值。


❗防漏

防漏其实就是left+right对应的值等于target-a-b的值,但是这时候我们不能就停止了。因为在[left,right]区间内还有更小的区间存在left+right对应的值等于target-a-b,比如下面的情况:

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

left和right对应的值相加等于-1,等于target-a-b=-1,但是我们还可以看到left++和right--更小的区间内也有符合条件的值。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法

所以和三数之和的算法原理分析一样的,遇到符合条件的值存入之后我们需要缩小区间。

力扣精选算法100题——四数之和(双指针专题),算法,leetcode,算法


第三步:实现代码

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target)
    {
        vector<vector<int>> ret;
        //排序
        sort(nums.begin(),nums.end());
        if(nums.size()<=2)
        {
            return ret;
        }
        //利用双指针解决问题
        for(int i=0;i<nums.size()-3;i++)//固定a
        {
            if(i>=1)//去重a
            {
                if(nums[i]==nums[i-1])continue;
            }
            for(int j=i+1;j<nums.size()-2;j++)//固定b
            {
                if(j>=i+2)//去重b
                {
                    if(nums[j]==nums[j-1])continue;
                }
                long long a=nums[i],b=nums[j],left=j+1,right=nums.size()-1;
                while(left<right)
                {
                    if(nums[left]+nums[right]<target-a-b)
                    {
                        left++;
                        while(left<right&&nums[left]==nums[left-1])
                        {
                        left++;
                        }
                    }
                    else if(nums[left]+nums[right]>target-a-b)
                    {
                        right--;
                        while(left<right&&nums[right]==nums[right+1])
                        {
                            right--;
                        }
                    }
                    else
                    {
                        ret.push_back({nums[i],nums[j],nums[left],nums[right]});
                        left++;//防漏
                        while(left<right&&nums[left]==nums[left-1])去重
                        {
                            left++;
                        }
                        right--;防漏
                        while(left<right&&nums[right]==nums[right+1])去重
                        {
                            right--;
                        }
                    }
                }
            }
        }
        return ret;
    }
};

我是我自己码头文章来源地址https://www.toymoban.com/news/detail-806105.html

到了这里,关于力扣精选算法100题——四数之和(双指针专题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣精选算法100题——水果成篮(滑动窗口专题)

    本题链接👉水果成篮 我就按照实例1来进行对这题的理解。 1代表种类类型,这个数组里面有2个种类类型 ps:种类1和种类2 ,只不过种类1是有2个水果,种类2有一个水果,共计3个水果。 本题需要解答:收集水果的最大数目. 但是前提条件: 我们只有2个篮子,每个篮子里只能装

    2024年01月17日
    浏览(32)
  • 力扣精选算法100题——找到字符串中所有字母异位词(滑动窗口专题)

    本题链接👉找到字符串中所有字母异位词 给定2个字符串s和p,找到s中所有p的变位词的字串,就是p是\\\"abc\\\",在s串中找到与p串相等的字串,可以位置不同,但是字母必须相同,比如”bca\\\",\\\"bac\\\"等,都是可以被称之为变位词。最终返回与p串字母相等但排列不同的字符串的初始索引

    2024年01月19日
    浏览(59)
  • 18. 四数之和(力扣LeetCode)

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你

    2024年02月19日
    浏览(32)
  • (双指针 ) 18. 四数之和 ——【Leetcode每日一题】

    难度:中等 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且 不重复 的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d n a 、 b 、 c 和 d 互不相同 nums[a] + nums[b] + nums[c

    2024年02月07日
    浏览(45)
  • [哈希专题]四数相加|赎金信|三数之和|四数之和

    此题思路:前两个数求和sum,sum1=0-后两数之和。判断sum1是否在之前出现过,此时用到哈希表,即判断sum1是否在前两个数中出现过。从而求得个数。 此题思路:定义两个指针left和right,遍历i,看三个位置的值是否为0。如果三个点值大于0,right--;如果小于0,left++。等于零即

    2024年01月17日
    浏览(35)
  • 【LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月13日
    浏览(30)
  • 【算法专题突破】双指针 - 三数之和(7)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:15. 三数之和 - 力扣(Leetcode)  题目就是要找出和为0的不重复的三元组, 注意三元组的每个元素是得不同的位置,那不重复又是什么意思呢? 我们可以看第一个示例, 他找出了三个三元组,但是他最后只返回

    2024年02月09日
    浏览(30)
  • 力扣【四数之和】

    18. 四数之和 给你一个由  n  个整数组成的数组  nums  ,和一个目标值  target  。请你找出并返回满足下述全部条件且 不重复 的四元组  [nums[a], nums[b], nums[c], nums[d]]  (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d  n a 、 b 、 c  和  d   互不相同

    2024年01月25日
    浏览(20)
  • leetcode-hot100双指针专题

    题目链接 283. 移动零 - 力扣(LeetCode) 解题思路 我们创建两个指针i,j,第一次遍历的时候指针j用来记录当前面有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后,j指针的下标就指向了最后一个非0元素下边。 第二次遍历,起始位置就从

    2024年01月23日
    浏览(29)
  • 【力扣每日一题】2023.7.15 四数之和

    这题和本月出过的每日一题:两数之和,三数之和类似。 不夸张的说只要把三数之和的代码拿来再套层for循环改改就可以了。 不过我这里还是简单捋一捋思路,题目给一个数组,要求返回所有长度为4,总和为 target 的子数组(不用连续)。 比较容易想到的是暴力解法,直接

    2024年02月16日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包