leetCode15三数之和(双指针)

目录

1、题目

2、思路

3、代码

4、总结


1、题目

给你一个由 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:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

2、思路

1、对数组进行正序排序,可以防止结果重复
2、循环遍历数组,退化成求2数之和, 循环指数i,i从0开始,注意:需要判断nums[i-1]==nums[i],避免重复结果
3、使用双指着, 左指针j=i+1,  右指针q=nums.length - 1,(1)如果nums[i]+nums[j]+nums[q]>sum,   右指针左移(2)如果nums[i]+nums[j]+nums[q]==sum,   左指针右移,符合结果的数据(3)如果nums[i]+nums[j]+nums[q]<sum,   左指针右移注意:1、要判断nums[i-1]==nums[i]2、需要判断j,q的边界值,免得越界

3、代码

public static List<List<Integer>> threeSum1(int[] nums) {List<List<Integer>> resultList = new ArrayList<>();if (nums == null || nums.length < 3) {return resultList;}//排序Arrays.sort(nums);for (int i = 0; i < nums.length && nums[i] <= 0; i++) {//判断是否重复if (i >= 1 && nums[i] == nums[i - 1]) {continue;}//2数之和int xx = 0 - nums[i];//左指针int j = i + 1;//右指针int q = nums.length - 1;//双指针while (j < q && q >= 0) {//判断是否重复if (j > i + 1 && nums[j] == nums[j - 1]) {j++;continue;}if (nums[j] + nums[q] == xx) {List<Integer> pathList = new ArrayList<>();pathList.add(nums[i]);pathList.add(nums[j]);pathList.add(nums[q]);resultList.add(pathList);j++;} else {if (nums[j] + nums[q] > xx) {//移动右指针q--;} else {//移动左指针j++;}}}}return resultList;
}

4、总结

1、2数之和,可以直接用这个思路

2、4数之和,可以先简化成求3数之和,思路和这个类似

3、一定要注意先做排序,以及遍历循环,要判断nums[i]==nums[i-1],重复就跳过,免得结果重复

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

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

相关文章

MongoDB - 数组更新操作符:$、$[]、$pop、$pull、$push、$each、$sort、$slice、$position

文章目录 1. $1. 更新数组中的值2. 更新数组中的嵌入文档 2. $[]1. 更新数组中的所有元素2. 更新数组中的所有嵌入文档 3. $pop1. 删除数组的第一个元素2. 删除数组的最后一个元素 4. $pull1. 删除所有等于指定值的项2. 删除与指定条件匹配的所有项3. 从文档数组中删除项4. 从嵌…

跨棒距、公法线和齿厚对应关系分析

前面有一期讨论了下滚齿径向进刀量和齿厚的对应关系&#xff1a;《》&#xff0c;有小伙伴又问了&#xff0c;加工时是用跨棒距或者公法线去控制齿厚的&#xff0c;直接给齿厚是无法测量的&#xff0c;如果测一个值再去计算&#xff0c;有点麻烦&#xff0c;有没有他们之间的对…

多多OJ评测系统 在前端脚手架Vue-Cli中设置页面路由

目录 设置页面路由 我们把菜单上的路由改成读取路由文件 设置成export 导出路由 在刚刚的原始路由 index.ts中导入就行了 在这边引入我们的路由文件 我们之后点击菜单 我们的路由文件是这样的 但是没有跳转 写一下事件 接下来要同步路由到菜单项 自己定义监听函数 …

【Springboot starter 组件开发】限流组件 RateLimiter

【Springboot starter 组件开发】限流组件 RateLimiter 一、摘要二、基于guava实现2.1 核心依赖2.2 核心逻辑 三、基于Redis lua脚本实现3.1 核心依赖3.2 核心逻辑 一、摘要 基于guava的RateLimiter&#xff0c;实现限流基于redis lua脚本(推荐&#xff0c;准确性高)&#x…

推荐3款不可错过的实用工具

TouchPro TouchPro是一款运行于Windows系统下的时间属性修改工具&#xff0c;其主要功能是允许用户批量修改文件和文件夹的创建时间、修改时间和访问时间。该软件安装后会集成到资源管理器中&#xff0c;不占用任何系统资源&#xff0c;并支持多级目录与隐藏文件的日期属性批量…

mysql数据迁移,全量和增量

mysql是常用的数据库。数据迁移一般有2种&#xff0c;增量数据和历史数据。 假设我有2个数据库mysqlA和mysqlB。 mysqlB是新的数据库&#xff0c;mysqlA是旧的数据库。 A->B。首先我们选定一个时间为历史数据。将这部分的数据全部输入到B里。 接下来将服务切换的B库。然后…

推荐几款支持AI剪辑并可使用个人视频素材的软件!

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 其实现在大部分的AI视频剪辑工具都可以实现一键成片&#xff0c;这里给你分享6款可以使用自己的素材实现AI剪辑的工具及其操作方法&#xff01; 一、剪映 剪映…

服务器重启了之后就卡在某个页面了,花屏,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++:完美转发和可变参数模板

完美转发和可变参数模板 (1)完美转发 A.What&#xff08;什么是完美转发&#xff09; 某些函数将其一个或多个实参连同其类型不变地转发给其它函数&#xff0c;我们需要保证被转发实参的所有性质&#xff0c;这种保证转发实参所有性质的参数传递&#xff0c;我们称之为“完美…

前端开发知识(二)-css

<head> <style> div{ } </style> </head> div是布局标签&#xff0c; 一般放在head标签内&#xff0c;最下部。 若直接在在.css文件中写css,文件中&#xff0c;直接写就行&#xff0c;如下所示。 div{ }

MySQL数据库安装使用

我们都知道数据库又分为关系型数据库和非关系型数据库&#xff1b; 关系型数据库指采用了关系模型来组织数据的数据库&#xff0c;指的就是二维表格模型。可以先初步理解为Excel表格。非关系型数据库又被称为NoSQL&#xff0c;对NoSQL 最普遍的定义是“非关联型的”&#xff0…

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…

JAVA零基础小白自学日志——第二十三天

文章目录 1.访问范围权限关键字2.private&#xff08;私有&#xff09;3.default&#xff08;默认&#xff09;4.protected&#xff08;受保护的&#xff09;5.public&#xff08;公共&#xff09; 今日摘要&#xff1a;再谈访问范围 1.访问范围权限关键字 项目同一个类同一个…

Linux环境安装KubeSphere容器云平台并实现远程访问Web UI 界面

文章目录 前言1. 部署KubeSphere2. 本地测试访问3. Linux 安装Cpolar4. 配置KubeSphere公网访问地址5. 公网远程访问KubeSphere6. 固定KubeSphere公网地址 前言 本文主要介绍如何在Linux CentOS搭建KubeSphere并结合Cpolar内网穿透工具&#xff0c;实现远程访问&#xff0c;根…

HTTP请求入参类型解读

HTTP请求入参类型解读 Content-Type 在HTTP请求中&#xff0c;Content-Type请求头用于指示资源的MIME类型&#xff0c;即请求体的媒体类型。它告诉服务器实际发送的数据类型是什么&#xff0c;以便服务器能够正确地解析和处理这些数据。Content-Type可以有多种值&#xff0c;…

服务器怎样减少带宽消耗的问题?

择业在使用服务器的过程中会消耗大量的带宽资源&#xff0c;而减少服务器的带宽消耗则可以帮助企业降低经济成本&#xff0c;同时还能够提高用户的访问速度&#xff0c;那么服务器怎样能减少带宽的消耗呢&#xff1f;本文就来带领大家一起来探讨一下吧&#xff01; 企业可以选择…

详解建造者(builder)模式的创建对象使用方式

目录 抽象类代码导入依赖Pizza类Topping 枚举成员变量内部抽象类 BuilderBuilder 类的成员变量addTopping 方法&#xff1a;build 方法&#xff1a;self 方法&#xff1a;Pizza 类的构造函数&#xff1a; 实现类代码1. 导入Objects类2. NyPizza类3. Calzone类递归泛型类型stati…

C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等

C 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等 flyfish 0. 隐式转换&#xff08;Implicit Conversions&#xff09; 隐式转换是编译器自动进行的类型转换&#xff0c;通常在需要将一个类型转换为另一个类型以匹配函数参…

kafka架构+原理+源码

1.安装jdk17 sudo yum -y update sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm sudo yum -y install ./jdk-17_linux-x64_bin.rpm、 sudo java -version 2.安装kafka How to easily install kafka without zookeeper | Aditya’s Blog …

负载均衡工具haproxy完整安装部署流程 及 haproxy通过域名匹配进行负载-基于域名负载均衡的Haproxy配置

一、负载均衡工具haproxy完整安装部署流程 1. 关于负载均衡和haproxy 负载均衡是系统设计最常见的一种方式&#xff0c;Nginx、HAProxy、LVS、F5用得比较普遍&#xff0c;不过Nginx只能在HTTP层负载&#xff0c;而HAProxy即可以在7层做负载&#xff0c;也可以在4层做负载&…