面试热题(三数之和)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

       梦开始的地方(两数之和),这其实和两数之和的做法大同小异,三数之和我们开始将其拆分成一数枚举,剩余两数凑结果即可

        因为我们利用类似于滑动窗口类似的技巧,所以我们必须要求该数组是一个有序的数组,所以我们先要对数组进行排序

 Arrays.sort(nums);

然后对数组中的每个元素进行枚举,相当于确定一个数

 //因为我们这是三数之和,所以我们的第一个数醉倒可以枚举到倒数第三个数for (int i = 0; i < nums.length - 2; i++) {}

因为在遍历的时候,我们可以优先的对过程进行剪枝操作:

1.如果前面3个数相加已经大于零,后面的数就不可能在等于零,故可以剪去

2.如果第一个数加上最大的两个数都小于零,最大的数都小于零,更何况中间的数呢?故可以进行剪去

3.因为题目中不允许我们又重复的结果出现,我们也可以将其进行剪去

那么我们就可以得到如下:

             int x = nums[i];//如果前三个数之和大于零,后面的数之和就不可能有等于零的情况if (nums[i] + nums[i + 1] + nums[i + 2] > 0) {break;}//加上两个最大的值也小于零,直接跳过这个x值if (nums[i] + nums[n - 1] + nums[n - 2] < 0) {continue;}//为了避免重复的情况的发生,如果相等则直接跳过if (i>0&&nums[i] == nums[i - 1]) {continue;}

       现在的问题就转换成在固定的区间内找到满足target的两数之和,通过双指针不断的从两边收缩进行求解

            int j = i + 1;int k = n-1;while (j < k) {//两数和int sum = x + nums[k] + nums[j];//如果大于,说明k指向的数太大了,往左移if (sum > 0) {k--;//如果小于,说明j指向的数太小了,往右移} else if (sum < 0) {j++;//如果相等,先将3个符合条件的数添加到list中去} else {list.add(Arrays.asList(x,nums[j],nums[k]));//为了避免结果重复,左指针碰到相邻重复的直接跳过while (j < k && nums[j] == nums[j+1]) {j++;}j++;// //为了避免结果重复,右指针碰到相邻重复的直接跳过while (j < k && nums[k] == nums[k-1]) {k--;}k--;}}

源码如下:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<>();//先对入参进行判断,如果nums为空,直接返回if (nums == null || nums.length == 0) {return list;}Arrays.sort(nums);int n = nums.length;//枚举每一个元素,设置两个指针进行跑for (int i = 0; i < nums.length - 2; i++) {int x = nums[i];//如果前三个数之和大于零,后面的数之和就不可能有等于零的情况if (nums[i] + nums[i + 1] + nums[i + 2] > 0) {break;}//加上两个最大的值也小于零,直接跳过这个x值if (nums[i] + nums[n - 1] + nums[n - 2] < 0) {continue;}//为了避免重复的情况的发生,如果相等则直接跳过if (i>0&&nums[i] == nums[i - 1]) {continue;}int j = i + 1;int k = n-1;while (j < k) {int sum = x + nums[k] + nums[j];if (sum > 0) {k--;} else if (sum < 0) {j++;} else {list.add(Arrays.asList(x,nums[j],nums[k]));while (j < k && nums[j] == nums[j+1]) {j++;}j++;while (j < k && nums[k] == nums[k-1]) {k--;}k--;}}}return list;}

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

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

相关文章

通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示

通过控制ros节点的启停&#xff0c;软实现人工控制和紧急停止功能的图示 实现原理简介&#xff1a; 人工控制的节点&#xff1a; 键盘节点 方向盘节点 自动控制的节点&#xff1a; movebase 导航 autoware 等 底盘节点&#xff1a; 差速底盘 阿克曼底盘 控制节点&#xff1…

RocketMQ使用

说明&#xff1a;本文介绍RocketMQ的消费模式&消息类型&#xff0c;RocketMQ的安装参考及简单使用&#xff0c;参考&#xff1a;http://t.csdn.cn/BKFPj 消费模式 RocketMQ与RabbitMQ最大的区别在于&#xff0c;RocketMQ是根据消息的Topic锁定消费者的&#xff0c;Topic属…

什么是BitTorrent协议?

BitTorrent 是一个 P2P (Peer-to-Peer) 通信协议&#xff0c;它设计用于分发数据和电子文件在互联网上。BitTorrent 是目前世界上最流行的 P2P 文件共享协议之一&#xff0c;以下是对 BitTorrent 协议的详细解释&#xff1a; 种子和对等体&#xff1a; 种子&#xff08;Torrent…

Centos7.9安装lrzsz进行文件传输---Linux工作笔记059

这里咱们lrzsz命令,需要用来进行文件传输,因为如果不安装这个命令的话,那么 传输安装包什么的就不方便因为只有少数传输工具,才支持,直接拖拽的.没有的时候就可以用这个工具,用命令来传输 直接就是: sz 文件名 就可以把文件下载下来 rz 选择一个文件, 就可以把文件上传到当…

dingding机器人

“自定义机器人”只支持消息发送&#xff0c;自动回复需要“企业内部机器人” 消息发送 import requests import jsonres requests.post(https://oapi.dingtalk.com/robot/send?access_token036a339axxx,data json.dumps({"text": {"content":"h…

LVS-DR模式集群构建过程演示

一、工作原理 LVS的工作原理 1.当用户向负载均衡调度器&#xff08;Director Server&#xff09;发起请求&#xff0c;调度器将请求发往至内核空间 2.PREROUTING链首先会接收到用户请求&#xff0c;判断目标IP确定是本机IP&#xff0c;将数据包发往INPUT链 3.IPVS是工作在IN…

图像多目标跟踪

目标跟踪&#xff08;Object Tracking&#xff09;是自动驾驶中常见的任务&#xff0c;根据跟踪目标数量的不同&#xff0c;目标跟踪可分为&#xff1a; 单目标跟踪&#xff08;Single Object Tracking&#xff0c;SOT&#xff09;多目标跟踪&#xff08;Multi-Objects Tracki…

Ubuntu18.04版本安装ROS及出现错误的处理方法

前面的文章是在已安装的ROS基础上做的一些应用&#xff0c;这里我们从零开始安装ROS机器人操作系统。 机器人操作系统(Robot Operating System,ROS)是一个开发机器人软件的框架&#xff0c;里面包含了一系列的工具&#xff0c;库和惯例&#xff0c;目的在于简化在大量不同种类机…

系统架构设计专业技能 · 软件工程(一)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

修改第三方组件默认样式

深度选择器 修改el-input的样式&#xff1a; <el-input class"input-area"></el-input>查看DOM结构&#xff1a; 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }将 input 框背景色改为…

基于STM32微控制器的物联网(IoT)节点设计与实现

基于STM32微控制器的物联网(IoT)节点的设计和实现。我们讨论物联网节点的基本概念和功能,并详细介绍了STM32微控制器的特点和优势。然后,我们将探讨如何使用STM32开发环境和相关的硬件模块来设计和实现一个完整的物联网节点。最后,我们将提供一个示例代码,展示如何在STM3…

JAVA(一)

我的第一个JAVA程序 以下我们通过一个简单的实例来展示Java编程,创建文件HelloWorld.java&#xff08;文件名需与类名一致&#xff09;,代码如下 实例 public class HelloWorld{public static void main(String[] args){System.out.println(Hello World) } } 注:Srting ar…