首页 > 编程语言 >四数之和算法讲解

四数之和算法讲解

时间:2024-03-30 18:00:46浏览次数:28  
标签:四数 target nums ++ int 算法 right 讲解 left

题目

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

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案

题目解析

1.选择的四个数字位置不能是一样的

2.题目中的a,b,c,d各不相同

3.可以按照任意顺序返回答案

讲解算法原理

解法一

排序+暴力枚举+利用set去重即可(该方法超时,不做讲解)

解法二

排序+双指针

先确定一个数值a,再用target代表四个数值的和减去a

1.依次固定一个数a

2.在a后面的区间内,利用“三数之和”找到三个数,使得三个数的和等于target-a即可;

----------------------------------->

1.依次固定一个数b;

2.在b后面的区间里,利用双指针找到两个数,使得这两个函数的和等于target-a-b;

细节处理(三个数之和已经讲过)

1.不重

2.不漏

代码

class Solution 
{
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> ret;
        //排序
        sort(nums.begin(), nums.end());
        //利用双指针解决问题
        int n = nums.size();
        for(int i = 0; i < n; i++)
        {
            //利用三数之和
            for(int j = i + 1; j < n; j++) //固定数b
            {
                //双指针解法
                int left = j + 1, right = n - 1;
                int aim = target - nums[i] - nums[j];
                while(left < right)
                {
                    int sum = nums[left] + nums[right];
                    if(sum < aim)  
                        left++;
                    else if(sum > aim)  
                        right--;
                    else
                    {
                        ret.push_back({nums[i], nums[j], nums[left++], nums[right--]});
                        //去重一
                        while(left < right && nums[left] == nums[left - 1])   
                            left++;
                        while(left < right && nums[right] == nums[right + 1]) 
                            right--;
                    }
                }
                //去重
                j++;
                while(j < n && nums[j] == nums[j - 1])  
                    j++;
            }
            //去重三
            while(i < n && nums[i] == nums[i - 1])  
                i++;
        }
        return ret;
    }
};

标签:四数,target,nums,++,int,算法,right,讲解,left
From: https://blog.csdn.net/2301_78350690/article/details/137177330

相关文章

  • 图解《程序员面试常见的十大算法》及代码实现
    关注我,持续分享逻辑思维&管理思维;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。推荐热榜内容:《C#实例:SQL如何添加......
  • 时间序列预测算法python全集合--深度学习
    共整理了60+个深度学习的时间序列预测算法,Python代码,包括多输入单输出,单输入单输出。深度学习算法主要为:LSTM,bilstm,grubigru,arima,ssa-arima,ceemdan,bp,elm,kelm,knn,mlp,slp,svm,XGBOOST,lightgbm,catboost,rf,lssvm,RNN,SARIMA,transformer等智能优化算法:SSA,WOA,AVOA,CS,DBO,FA,FWA,GW......
  • Offer必备算法18_栈_五道力扣题详解(由易到难)
    目录①力扣1047.删除字符串中的所有相邻重复项解析代码②力扣844.比较含退格的字符串解析代码③力扣227.基本计算器II解析代码④力扣394.字符串解码解析代码⑤力扣946.验证栈序列解析代码本篇完。①力扣1047.删除字符串中的所有相邻重复项1047.删除字符......
  • Tarjan 算法——图论学习笔记
    Part.1引入在图论问题中,我们经常去研究一些连通性问题,比如:有向图的联通性:传递闭包——Floyd算法;有向图连通性的对称性:强联通分量(SCC)——Tarjan算法缩点;无向图的联通性:并查集;无向图的关键边:桥(割边)、边双——Tarjan算法缩点;无向图的关键点:割点、点双——Tarjan建立圆方......
  • 莫队算法学习笔记
    Part.1引入当你遇到一个区间询问但是难以用线段树等log算法维护的时候怎么办?那就是——莫队!莫队这个东西能支持区间修改、区间查询的操作,但是这种算法要求离线。莫队有很多种,详细请看下文。Part.2普通莫队我们先来看一道例题(P1972的削弱版):给你一个长度为\(n\)的序列......
  • KMP算法
    对于字符串“abababca”,它的next如下表所示:voidget_next(SStringT,int*next){inti=1,j=0;next[1]=0;//next[1]的值总是0while(i<T.length){if(j==0||T.ch[i]==T.ch[j]){//如果j处于0位或者,俩字符相等++i......
  • 基于SpringBoot+Vue的电子产品销售网站的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我自己的网站自己的小程序(小蔡coding)代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue的高校工作室管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我自己的网站自己的小程序(小蔡coding)代码参考数据库参考源码获取前言......
  • 基于DWT(离散小波变换)的图像加密水印算法,Matlab实现
           博主简介:专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188)       个人主页:Matlab_ImagePro-CSDN博客       原则:代码均由本人编写完成,非中介,提供有偿Matlab算法代码编程服务,不从事不违反涉及学术原则......
  • 代码随想录算法训练营第六十天|84.柱状图中最大的矩形
    84.柱状图中最大的矩形刷题https://leetcode.cn/problems/largest-rectangle-in-histogram/description/文章讲解https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.html视频讲解https://www.bilibili.com......