[Java恶补day6] 15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:
输入: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] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:
3 <= nums.length <= 3000
− 10 5 -10^5 105 <= nums[i] <= 10 5 10^5 105


知识点:
数组、双指针、排序、问题转换为两数之和


解:
首先,我没考虑到最暴力的三个嵌套for循环,因为它的复杂度非常大,而本题的核心考点就是双指针,因此需要考虑如何将问题转换为求双指针的问题。
一个很简单的思路,就是固定其中一个数,去处理另外两个数,因此,用for循环代表第一个数的遍历。
因为题目要求结果不能包含重复的三元组,因此:
①将原始数组进行升序排序,再去遍历,得到的三元组的数字满足a≤b≤c,这样就不会出现b,a,c等顺序,因此能避免结果出现重复的三元组。
②在每次遍历中,当前处理的数字,不能和上一次遍历处理的数字相同,例如:当前第二个元素、上一次遍历的第二个元素相同,那么这样就会产生重复。因此,当遇到和上一次遍历相同的数字,就跳过当前这个数字的遍历。

基于这个分析,在对pi的for循环遍历中,定义双指针pj、pk,分别用于遍历第二个数、第三个数,并根据#两数之和这道题的思路,两个指针从两端开始向中间遍历,只要左指针指向的数字<右指针指向的数字,就继续循环。
对于每次得到的第二个数、第三个数,我们计算三数之和sum,并有以下三种情况:
①若和为0,满足条件,就构造List,存到结果列表中。然后要更新双指针。但首先,需要判断指针遍历的元素是否与上一次遍历的元素相同,若相同,则让指针向右/左移动一格。接下来,再去同时更新双指针(这里需要同时更新双指针,是因为:小的那个数变大,为了保持和不变,大的那个数要同时变小)。
②若和<0,表示我们要获得更大的一个数,由于第三个数代表的是三元组中最大的数,因此我们让代表第二个数的左指针右移一格。
③若和>0,表示我们要获得更小的一个数,由于第二个数代表的是三元组中最小的数(此时我们固定了第一个数,因此可以这么描述),因此我们让代表第三个数的右指针左移一格。

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n),由于对原始数组进行了排序,因此可视为使用一个额外的数组存储了nums的副本并进行排序 【该分析源自力扣官解】

class Solution {public List<List<Integer>> threeSum(int[] nums) {//目标:数组的三个不同数字和为0//定义最终结果的数据结构List<List<Integer>> res = new ArrayList<>();//数组长度int n = nums.length;//原数组进行排序,实现最终结果的去重Arrays.sort(nums);//遍历所有元素for (int pi = 0; pi < n - 2; pi++) {//当前遍历的第一个元素需要不等于前一个元素,以降低时间复杂度if (pi > 0 && nums[pi] == nums[pi - 1]) {continue;}//问题转化为:固定第一个数的情况下,对另外两个数进行常规双指针操作//定义双指针int pj = pi + 1;int pk = n - 1;//只要左指针<右指针,就继续循环while (pj < pk) {//计算三数之和int sum = nums[pi] + nums[pj] + nums[pk];if (sum == 0) {//满足要求,加入resList<Integer> triplets = new ArrayList<>();triplets.addAll(Arrays.asList(nums[pi], nums[pj], nums[pk]));//一次性添加三个元素res.add(triplets);//跳过重复元素while (pj < pk && nums[pj] == nums[pj + 1])pj++;while (pj < pk && nums[pk] == nums[pk - 1])pk--;//更新双指针(小的那个数变大,为了保持和不变,大的那个数要同时变小)pj++;pk--;} else if (sum < 0) {//和小于0,寻找比第二小的数稍微大一点的数pj++;} else {//和大于0,寻找比第一大的数稍微小一点的数pk--;}}}return res;}
}

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

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

相关文章

《黄帝内经》数学建模与形式化表征方式的重构

黄帝内经的数学概括&#xff1a;《黄帝内经》数学建模与形式化表征方式的重构 摘要&#xff1a;《黄帝内经》通过现代数学理论如动力系统、代数拓扑和随机过程&#xff0c;被重构为一个形式化的人体健康模型。该模型包括阴阳动力学的微分几何、五行代数的李群结构、经络拓扑与同…

理论篇五:如何优化Webpack的打包速度

优化 Webpack 打包速度是提升前端开发效率的关键。以下是 10 种核心优化策略,涵盖开发和生产环境,附带具体配置和实测效果对比: 一、缩小文件搜索范围 1. 指定解析路径(Resolve) resolve: {extensions: [.js, .jsx],

[Windows] 游戏常用运行库- Game Runtime Libraries Package(6.2.25.0409)

游戏常用运行库 合集 整合了许多游戏会用到的运行库&#xff0c;支持 Windows XP – Windows 11 系统&#xff0c;并且支持自动检测系统勾选推荐的运行库&#xff0c;方便快捷。 本版特点&#xff1a; By&#xff1a;mefcl 整合常见最新游戏所需运行库 根据系统自动勾选推荐…

JDK8中的 Stream流式编程用法优化(工具类在文章最后)

Java从JDK8起提供了Stream流这个功能&#xff0c;于是项目里出现了大量基于Stream流的写法。随着项目的进行&#xff0c;慢慢的代码中铺天盖地的都是下面的写法&#xff1a; List<User> userList null;if (condition) {userList new ArrayList<>();userList.add(…

uni-app学习笔记十二-vue3中组件传值(对象传值)

一.单对象传值 父组件定义对象的值 <template><view><UserInfo :obj"userinfo"></UserInfo></view> </template><script setup>import {ref} from "vue"const userinfo ref({name:"蛛儿",avatar:&…

UV-python环境管理工具 入门教程

在学习使用 MCP 的时候接触到了 UV 这个环境管理工具&#xff0c;经过对比&#xff0c;发现它在诸多方面比 venv、conda 等工具更为出色&#xff0c;因此整理了这份简单的入门学习笔记&#xff0c;希望能帮助大家快速上手。 介绍 UV 是一款集 Python 版本管理、虚拟环境创建与…

【漫话机器学习系列】277.梯度裁剪(Gradient Clipping)

【深度学习】什么是梯度裁剪&#xff08;Gradient Clipping&#xff09;&#xff1f;一张图彻底搞懂&#xff01; 在训练深度神经网络&#xff0c;尤其是 RNN、LSTM、Transformer 这类深层结构时&#xff0c;你是否遇到过以下情况&#xff1a; 模型 loss 突然变成 NaN&#xf…

零基础弄懂 ngx_http_slice_module分片缓存加速

一、为什么需要 Slice&#xff1f; 在 NGINX 反向代理或 CDN 场景中&#xff0c;大文件&#xff08;视频、软件包、镜像等&#xff09;常因单体体积过大而令缓存命中率低、回源代价高。 ngx_http_slice_module 通过把一次完整响应拆分成 固定大小的字节块&#xff08;Slice&am…

机器人强化学习入门学习笔记(三)

强化学习&#xff08;Reinforcement Learning, RL&#xff09;与监督学习不同——你不需要预先准备训练数据集&#xff0c;而是要设计环境、奖励函数&#xff0c;让智能体通过交互不断探索和学习。 &#x1f3af; 一、强化学习和训练数据的关系 强化学习不依赖固定的数据集。它…

【python实战】二手房房价数据分析与预测

个人主页&#xff1a;大数据蟒行探索者 目录 一、数据分析目标与任务 1.1背景介绍 1.2课程设计目标与任务 1.3研究方法与技术路线 二、数据预处理 2.1数据说明 2.2数据清洗 2.3数据处理 三、数据探索分析 四、数据分析模型 五、方案评估 摘要&#xff1a;随着社会经…

Kotlin IR编译器插件开发指南

在 Kotlin 中开发基于 IR&#xff08;Intermediate Representation&#xff09;的编译器插件&#xff0c;可以深度定制语言功能或实现高级代码转换。以下是分步骤指南&#xff1a; 一、IR 编译器插件基础 IR 是什么&#xff1f; Kotlin 编译器将源码转换为 IR 中间表示&#xf…

如何用 python 代码复现 MATLAB simulink 的 PID

MATLAB在 Simulink 里做以下设置MATLAB 脚本调用示例 python 实现离散 PID 实现&#xff08;并行形式&#xff09; Simulink 中两种 PID 结构&#xff08;并联形式, I-形式&#xff09;下连续/离散时域里积分增益 I 的表示并联&#xff08;Parallel&#xff09; vs 理想&#x…

黑马点评--基于Redis实现共享session登录

集群的session共享问题分析 session共享问题&#xff1a;多台Tomcat无法共享session存储空间&#xff0c;当请求切换到不同Tomcat服务时&#xff0c;原来存储在一台Tomcat服务中的数据&#xff0c;在其他Tomcat中是看不到的&#xff0c;这就导致了导致数据丢失的问题。 虽然系…

SkyWalking启动失败:OpenSearch分片数量达到上限的完美解决方案

🚨 问题现象 SkyWalking OAP服务启动时报错: org.apache.skywalking.oap.server.library.module.ModuleStartException: java.lang.RuntimeException: {"error":{"root_cause":[{"type":"validation_exception", "reason&q…

向量数据库选型实战指南:Milvus架构深度解析与技术对比

导读&#xff1a;随着大语言模型和AI应用的快速普及&#xff0c;传统数据库在处理高维向量数据时面临的性能瓶颈日益凸显。当文档经过嵌入模型处理生成768到1536维的向量后&#xff0c;传统B-Tree索引的检索效率会出现显著下降&#xff0c;而现代应用对毫秒级响应的严苛要求使得…

MySQL#秘籍#一条SQL语句执行时间以及资源分析

背景 一条 SQL 语句的执行完&#xff0c;每个模块耗时&#xff0c;不同资源(CPU/IO/IPC/SWAP)消耗情况我该如何知道呢&#xff1f;别慌俺有 - MySQL profiling 1. SQL语句执行前 - 开启profiling -- profiling (0-关闭 1-开启) -- 或者&#xff1a;show variables like prof…

【数据结构】实现方式、应用场景与优缺点的系统总结

以下是编程中常见的数据结构及其实现方式、应用场景与优缺点的系统总结&#xff1a; 一、线性数据结构 1. 数组 (Array) 定义&#xff1a;连续内存空间存储相同类型元素。实现方式&#xff1a;int[] arr new int[10]; // Javaarr [0] * 10 # Python操作&#xff1a; 访问&…

PyTorch中cdist和sum函数使用示例详解

以下是PyTorch中cdist与sum函数的联合使用详解: 1. cdist函数解析 功能:计算两个张量间的成对距离矩阵 输入格式: X1:形状为(B, P, M)的张量X2:形状为(B, R, M)的张量p:距离类型(默认2表示欧式距离)输出:形状为(B, P, R)的距离矩阵,其中元素 d i j d_{ij} dij​表示…

Ansible配置文件常用选项详解

Ansible 的配置文件采用 INI 格式&#xff0c;分为多个模块&#xff0c;每个模块包含特定功能的配置参数。 以下是ansible.cfg配置文件中对各部分的详细解析&#xff1a; [defaults]&#xff08;全局默认配置&#xff09; inventory 指定主机清单文件路径&#xff0c;默认值为 …

了解FTP搜索引擎

根据资料&#xff0c; FTP搜索引擎是专门搜集匿名FTP服务器提供的目录列表&#xff0c;并向用户提供文件信息的网站&#xff1b; FTP搜索引擎专门针对FTP服务器上的文件进行搜索&#xff1b; 就是它的搜索结果是一些FTP资源&#xff1b; 知名的FTP搜索引擎如下&#xff0c; …