面试热题(三数之和)

news2025/2/27 16:29:06

给你一个整数数组 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.coloradmin.cn/o/862553.html

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

相关文章

Git提交代码仓库的两种方式

一: 两种本地与远程仓库同步 """ 1&#xff09;你作为项目仓库初始化人员&#xff1a; 线上要创建空仓库 > 本地初始化好仓库 > 建立remote链接(remote add) > 提交本地仓库到远程(push) 2&#xff09;你作为项目后期开发人员&#xff1a; 远程项目仓…

易服客工作室:创建WordPress会员网站的终极指南

您想建立会员网站吗&#xff1f;长期以来&#xff0c;网站所有者仅依靠广告和联盟收入来将其内容货币化。 会员网站允许您通过用户支付高级内容、功能和社区访问权限来赚钱。 您将需要一个具有管理用户、会员资格、付款等功能的平台。幸运的是&#xff0c;有一些非常好的Word…

LeetCode--HOT100题(27)

目录 题目描述&#xff1a;21. 合并两个有序链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;21. 合并两个有序链表&#xff08;简单&#xff09; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组…

剑指offer-1.1C++

sizeof空类问题 问&#xff1a;定义一个空的类型&#xff0c;里面没有任何成员变量和成员函数。对该类型求sizeof&#xff0c;得到的结果是多少&#xff1f; 答&#xff1a;1 问&#xff1a;为什么不是0&#xff1f; 答&#xff1a;空类型的实例中不包含任何信息&#xff0…

为什么企业要使用SAAS?

出于多种原因&#xff0c;企业应考虑使用SaaS服务&#xff0c;因为它提供了许多优势&#xff0c;可以对运营、生产力和成本效益产生积极影响。常见的关键原因&#xff1a; 1.成本效益&#xff1a;SaaS 使企业无需在硬件、软件许可证和 IT 基础设施上进行大量投资。相反&#x…

腾讯云轻量应用服务器CPU型号?处理器主频多少?

腾讯云轻量应用服务器CPU型号是什么&#xff1f;处理器主频多少&#xff1f;轻量应用服务器不支持指定CPU处理器型号&#xff0c;目前腾讯云服务器网账号下的轻量应用服务器&#xff0c;CPU采用2.5GHz主频的Intel(R) Xeon(R) Gold 6133 处理器&#xff0c;睿频 3.0GHz&#xff…

尼科彻斯定理

目录 1.题目概述 2.题解 思路分析 具体实现 1.题目概述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 例如&#xff1a; 1^31 2^335 3^37911 4^313151719 输入一个正整数m&#xff08;m≤100&#xff09;&#xff0c;将…

使用Java 8 中的 Stream 遍历树形结构

1 前言 可能平常会遇到一些需求&#xff0c;比如构建菜单&#xff0c;构建树形结构&#xff0c;数据库一般就使用父id来表示&#xff0c;为了降低数据库的查询压力&#xff0c;我们可以使用Java8中的Stream流一次性把数据查出来&#xff0c;然后通过流式处理&#xff0c;我们一…

R语言初学者书籍推荐

Home | Bookdown 这个网站上有很多R语言的书籍&#xff0c;并且一直在更新&#xff0c;阅读起来没有难度。 今天搜索材料的时候&#xff0c;检索到下面这本书&#xff1a; 有输入&#xff0c;才会有输出。

Java:简单算法:冒泡排序、选择排序、二分查找

冒泡排序 // 1、准备一个数组 int[] arr {5&#xff0c;2&#xff0c;3&#xff0c;1};//2、定义一个循环控制排几轮 for (int i 0; i < arr.length - 1; i) { // i 0 1 2 【5&#xff0c;2&#xff0c;3&#xff0c;1】 次数 // i 0 第一轮 0 1 2 …

Qt与电脑管家2

1.竖线的添加与样式的修改&#xff1a; color: rgb(238, 238, 238); 2. 通过修改之前的自定义btn类代码&#xff0c;可以比较容易地创造出各种各样的按钮类 头像的样式表代码&#xff1a; QPushButton{ border-image: url(:/images_up/icon.jpg); border-radius:20px; } QPu…

汽配企业想上MES管理系统,需要具备哪些条件

随着全球汽车行业的快速发展&#xff0c;汽配行业也面临着日益激烈的竞争和不断变化的市场环境。为了应对这种挑战&#xff0c;许多汽配企业开始考虑引入制造执行系统&#xff08;MES&#xff09;来提高生产效率和管理水平。然而&#xff0c;在实施MES管理系统解决方案之前&…

[保研/考研机试] KY35 最简真分数 北京大学复试上机题 C++实现

题目链接&#xff1a; 最简真分数https://www.nowcoder.com/share/jump/437195121691719749588 描述 给出n个正整数&#xff0c;任取两个数分别作为分子和分母组成最简真分数&#xff0c;编程求共有几个这样的组合。 输入描述&#xff1a; 每组包含n&#xff08;n<600&…

开启MySQL的binlog日志

1.判断MySQL是否已经开启binlog SHOW VARIABLES LIKE log_bin; 查看MySQL的binlog模式 show global variables like "binlog%";几个关于binlog常用的命令 #查看日志开启状态 show variables like log_%; #查看所有binlog日志列表 show master logs; #查看最新一个b…

Observability:识别生成式 AI 搜索体验中的慢速查询

作者&#xff1a;Philipp Kahr Elasticsearch Service 用户的重要注意事项&#xff1a;目前&#xff0c;本文中描述的 Kibana 设置更改仅限于 Cloud 控制台&#xff0c;如果没有我们支持团队的手动干预&#xff0c;则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制…

【产品人卫朋】专栏及配套资料更新:华为流程体系、产品经理、IPD与BLM模型

目录 前言 01 华为流程体系专栏 CSDN学院 02 产品经理进阶专栏 CSDN学院 03 华为战略方法论专栏 04 IPD 进阶 100 例专栏 作者介绍 前言 截止目前&#xff0c;本号已上线四大干货专栏&#xff0c;内容涉及&#xff1a; 01 华为流程体系&#xff08;图文视频&#xff0…

为什么DNS协议运行在UDP之上?

DNS (Domain Name System) 运行在 UDP (User Datagram Protocol) 上主要是出于以下原因&#xff1a; 简单性和效率&#xff1a;UDP 是无连接的&#xff0c;这意味着与建立和维护 TCP 连接相比&#xff0c;UDP 有更少的开销。当 DNS 查询被发送时&#xff0c;它只需要一个小的请…

MRO工业品采购过程中,采购人员要注意哪些事项

MRO工业品指工厂或企业对其生产和工作设施、设备进行保养、维修&#xff0c;保证其运行所需要的非生产性物料&#xff0c;这些物料可能是用于设备保养、维修的备品备件&#xff0c;也可能是保证企业正常运行的相关设备&#xff0c;耗材等物资&#xff0c;如安全防护、传媒广电、…

那些年的Android开发经验记录

Android Studio 新版Logcat 从惊艳到放弃 AS总算更新了这个logcat了&#xff0c;原来的logcat真是使用起来贼难受&#xff0c;动不动过滤就失效&#xff0c;或者日志不打印&#xff0c;新版的logcat初步使用下来&#xff0c;那是贼舒服&#xff0c;先上一张界面图 一眼看…

金蝶云星空与四化智造MES(API)对接集成供应商查询连通新增供应商信息(BASIC-KM同步供应商-TEST)

金蝶云星空与四化智造MES&#xff08;API&#xff09;对接集成供应商查询连通新增供应商信息(BASIC-KM同步供应商-TEST) 来源系统:金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平…