【算法——双指针】LeetCode 18 四数之和

news2025/1/12 12:25:46

题目描述:

解题思路:双指针

        四数之和与前面三数之和思路一样,排序后,枚举 nums[a]作为第一个数,枚举 nums[b]作为第二个数,那么问题变成找到另外两个数,使得这四个数的和等于 target,也是用双指针解决。

对于 nums[a]的枚举:

  1. 设 s=nums[a]+nums[a+1]+nums[a+2]+nums[a+3]。如果 s>targets,由于数组已经排序,后面无论怎么选,选出的四个数的和不会比 s 还小,所以后面不会找到等于 target的四数之和了。所以只要 s>targets,就可以直接 break 外层循环了。
  2. 设 s=nums[a]+nums[n−3]+nums[n−2]+nums[n−1]。如果 s<targets,由于数组已经排序,nums[a]加上后面任意三个数都不会超过 s,所以无法在后面找到另外三个数与 nums[a]相加等于 target。但是后面还有更大的 nums[a],可能出现四数之和等于 target的情况,所以还需要继续枚举,continue 外层循环。
  3. 如果 a>0且 nums[a]=nums[a−1],那么 nums[a]和后面数字相加的结果,必然在之前算出过,所以无需执行后续代码,直接 continue 外层循环。(可以放在循环开头判断。)

对于 nums[b]的枚举(b从 a+1开始),也同样有类似优化:

  1. 设 s=nums[a]+nums[b]+nums[b+1]+nums[b+2]。如果 s>targets,由于数组已经排序,后面无论怎么选,选出的四个数的和不会比 s还小,所以后面不会找到等于 target的四数之和了。所以只要 s>targets,就可以直接 break。
  2. 设 s=nums[a]+nums[b]+nums[n−2]+nums[n−1]。如果 s<targets,由于数组已经排序,nums[a]+nums[b]加上后面任意两个数都不会超过 sss,所以无法在后面找到另外两个数与 nums[a]和 nums[b]相加等于 target\。但是后面还有更大的 nums[b],可能出现四数之和等于 target的情况,所以还需要继续枚举,continue。
  3. 如果 b>a+1且 nums[b]=nums[b−1],那么 nums[b]和后面数字相加的结果,必然在之前算出过,所以无需执行后续代码,直接 continue。注意这里 b>a+1的判断是必须的,如果不判断,对于示例 2 这样的数据,会直接 continue,漏掉符合要求的答案。

另外:对于C++语言,相加结果可能会超过32位整数范围,需要用64位整数存储四数之和。

代码:

class Solution 
{
public:
    vector<vector<int>> fourSum(vector<int> &nums, int target) 
    {
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        int n = nums.size();
        for (int a = 0; a < n - 3; a++)     // 枚举第一个数
        { 
            long long x = nums[a];    // 使用 long long 避免溢出
            if (a > 0 && x == nums[a - 1]) 
                continue;    // 跳过重复数字
            if (x + nums[a + 1] + nums[a + 2] + nums[a + 3] > target) 
                break;    // 优化一
            if (x + nums[n - 3] + nums[n - 2] + nums[n - 1] < target) 
                continue;    // 优化二
            for (int b = a + 1; b < n - 2; b++)     // 枚举第二个数
            { 
                long long y = nums[b];
                if (b > a + 1 && y == nums[b - 1]) 
                    continue;    // 跳过重复数字
                if (x + y + nums[b + 1] + nums[b + 2] > target) 
                    break;    // 优化一
                if (x + y + nums[n - 2] + nums[n - 1] < target) 
                    continue;    // 优化二
                int c = b + 1, d = n - 1;
                while (c < d)     // 双指针枚举第三个数和第四个数
                { 
                    long long s = x + y + nums[c] + nums[d];    // 四数之和
                    if (s > target) 
                        d--;
                    else if (s < target) 
                        c++;
                    else         // s == target
                    { 
                        ans.push_back({(int) x, (int) y, nums[c], nums[d]});
                        for (c++; c < d && nums[c] == nums[c - 1]; c++);    // 跳过重复数字
                        for (d--; d > c && nums[d] == nums[d + 1]; d--);    // 跳过重复数字
                    }
                }
            }
        }
        return ans;
    }
};

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1071288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吃鸡玩家必备神器!一站式提升战斗力、分享干货!

大家好&#xff0c;我是吃鸡玩家。在这个视频中&#xff0c;我要分享一个让你瞬间提高战斗力的神器&#xff0c;同时让你享受到顶级游戏作战干货的盛宴&#xff01;让我们一起来了解吧&#xff01; 首先&#xff0c;我们推荐绝地求生作图工具。通过这款工具&#xff0c;你可以轻…

用这些IDEA插件,让你早下班两小时

GenerateAllSetter:一键调用一个对象的所有setter方法 RestfulTool:自动显示所有URL接口&#xff0c;快速检索接口 SequenceDiagram:以图形界面形式显示方法调用链&#xff0c;方便阅读源码、梳理代码 CamelCase:变量下划线转驼峰命名 Rainbow Brackets:帮助程序员识别代码中括…

十五、异常(5)

本章概要 异常限制构造器 异常限制 当覆盖方法的时候&#xff0c;只能抛出在基类方法的异常说明里列出的那些异常。这个限制很有用&#xff0c;因为这意味着与基类一起工作的代码&#xff0c;也能和导出类一起正常工作&#xff08;这是面向对象的基本概念&#xff09;&#…

基于SSM的校园资讯推荐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

关联规则挖掘:Apriori算法的深度探讨

目录 一、简介什么是关联规则挖掘&#xff1f;什么是频繁项集&#xff1f;什么是支持度与置信度&#xff1f;Apriori算法的重要性应用场景 二、理论基础项和项集支持度&#xff08;Support&#xff09;置信度&#xff08;Confidence&#xff09;提升度&#xff08;Lift&#xf…

SSM - Springboot - MyBatis-Plus 全栈体系(十八)

第四章 SpringMVC SpringMVC 实战&#xff1a;构建高效表述层框架 一、SpringMVC 简介和体验 1. 介绍 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从一开始就包含在 Spring Framework 中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08…

OCR让点读笔如虎添翼

点读笔是一种智能学习工具&#xff0c;它可以通过识别文字来提供相应的语音或图像反馈。在实现文字识别功能时&#xff0c;点读笔通常会借助OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。下面将详细介绍点读笔如何利用OCR技术实现文…

浅析人脸活体检测技术的两种方法

随着人脸识别技术日趋成熟,商业化应用愈加广泛,然而人脸极易用照片、视频等方式进行复制,因此对合法用户人脸的假冒是人脸识别与认证系统安全的重要威胁。目前基于动态视频人脸检测、人脸眨眼、热红外与可见光人脸关联等领先业界的人脸活体检测算法&#xff0c;已经取得了一定的…

Linux0.12内核源码解读(2)-Bootsect.S

作者&#xff1a;小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、源码解析、科技故事、项目实战、面试八股等更多硬核文章&#xff0c;首发于公众号「小牛呼噜噜」 文章目录 回顾计算机启动过程8086、80x86是什么意思?寄存器初始化CS:IPCPU是如何和ROM相连的?加载MBR到…

餐饮蛋糕鲜花便利店水果店外卖自提小程序开发

对于实体门店小微商家来说&#xff0c;做私域和复购永远是最划算的买卖。店里每天有新客到老客到&#xff0c;做好私域就可以零成本形成稳定客流而且还可以通过活动形成社交裂变和口碑效应。不做好私域和留存就是白白看着自己客户被同行一口一口吃掉。因此也就有了自提外卖小程…

制作婚礼邀请函只需三步,轻松制作走心请柬

制作自己的婚礼邀请函是一种流行的方式来传达你的婚礼信息给你的亲朋好友。在这个数字化的时代&#xff0c;你可以使用在线制作平台来创建自定义的婚礼邀请函。下面是一个简单的步骤指南&#xff0c;教你如何使用乔拓云网在线制作平台制作出超有感觉的婚礼请柬。 首先&#xff…

【Overload游戏引擎分析】从视图投影矩阵提取视锥体及overload对视锥体的封装

overoad代码中包含一段有意思的代码&#xff0c;可以从视图投影矩阵逆推出摄像机的视锥体&#xff0c;本文来分析一下原理 一、平面的方程 视锥体是用平面来表示的&#xff0c;所以先看看平面的数学表达。 平面方程可以由其法线N&#xff08;A, B, C&#xff09;和一个点Q(x0,…

【发表案例】计算机类SCIE,2区,2个月2天录用

计算机类SCIE 【期刊简介】IF&#xff1a;4.0-5.0&#xff0c;JCR2区&#xff0c;中科院3区 【检索情况】SCIE 在检&#xff0c;正刊 【征稿领域】提高安全性和隐私性的边缘/云的智能方法的研究&#xff0c;如数字孪生等 录用案例&#xff1a;2个月2天录用 2023.09.27 | A…

吃鸡玩家必备!提升战斗力,分享干货,保护账号安全!

你好&#xff01;吃鸡玩家们的福利来了&#xff01;在这里&#xff0c;我将为大家分享一些关于提高游戏战斗力、分享顶级游戏作战干货以及保护账号安全的实用技巧。 首先&#xff0c;让我们来谈提高游戏战斗力的技巧。绝地求生是一款战略性的游戏&#xff0c;而好的作图工具可以…

Java笔记八(instanceof,类型转换,static详解,抽象类,接口,内部类以及异常)

instanceof 引用类型&#xff0c;判断一个对象是什么类型 使用方法&#xff1a; System.out.println&#xff08;X instanceof Y&#xff09;&#xff1b; 代码理解&#xff1a; public class Application {public static void main(String[] args) {//Obiect>String//…

如何成为合格的测试开发工程师?

是入职两年半的测试开发工程师小编&#xff0c;虽然目前很菜&#xff0c;但还是希望自己继续努力&#xff0c;早日成为一名合格的测试开发工程师&#xff0c;本篇文章也是通过对身边同事的了解&#xff0c;整理了几点对自己的要求&#xff0c;以及重新梳理了下今后的学习路径&a…

CI522 13.56MHZ电动车NFC测试资料

Ci522是一颗工作在13.56MHz频率下的非接触式读写芯片&#xff0c;支持读A卡&#xff08;CI523支持读A/B卡&#xff09;&#xff0c;可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本&#xff0c;PCB小体积的产品提供了可靠的选择。 Ci522与Si522/MFRC52…

母婴店做微信小程序开发的重要性

随着移动互联网的发展&#xff0c;母婴店传统的线下销售模式已经无法满足现代年轻父母的需求。微信小程序作为一种新型的应用形态&#xff0c;为母婴店提供了新的销售渠道和推广方式。本文将探讨母婴店做微信小程序开发的作用。 一、拓展销售渠道 微信小程序是一种轻量级的应用…

混沌工程初分享

混沌工程初分享 一、什么是混沌工程 1、什么是混沌 混沌是一种现象&#xff0c;在一个动力系统中&#xff0c;因为各种不同的参数变化导致的一系列的连锁反应。比如&#xff1a; 在南美洲亚马逊河流域热带雨林中的蝴蝶&#xff0c;偶尔的几次振翅&#xff0c;可以在两周以后引…

下载遥感数据慢的原因

由于地图资源下载工具2.0工具能够“批量下载”、“错误重试”和“断点续传“&#xff0c;我能够长时间下载并监测网络下载的情况及看到错误&#xff0c;因此我对部分下载进行了分析和总结&#xff1a; 这类网站例如&#xff1a;LANDSAT下载网站!下载速度并不是一直慢而是分时段…