【力扣: 15题: 三数之和】

15题: 三数之和

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

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

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

【思路1】

首先对数组进行排序题目等效于: 求 X + Y + Z = 0 , X != Y  != Z 而且数组中元素又不可以重复, 那么我们可以认为 三个元素的大小顺序 就是  X <= Y <= Z 那么可以理解 , X 就是3个元素中,最小的, 如果存在,则一定满足
X <= 0 , 且 Z >= 0 并且当 X= 0 , 那么一定是 Y=0,且 Z=0 这一种情况。那么可以根据 X+Y 的值 去Z中找 Z = -(X+Y)在第2层for循环中,利用二分查找,进行优化,而不是开启第三层for循环。(如果第三层直接 for循环, 则会超时~)

解答:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请* <p>* 你返回所有和为 0 且不重复的三元组。*/
public class Solution {// 第3层循环改为2分查找public List<List<Integer>> threeSum(int[] nums) {// 默认 x , y, z 由小到大List<List<Integer>> list = new ArrayList<>();// 1. 对数组进行排序Arrays.sort(nums);// 2. 进行遍历for (int i = 0; i < nums.length; i++) {// 如果x>0,则直接结束for循环if (nums[i] > 0) {break;}if (i >= 1 && nums[i] == nums[i - 1]) {continue;}for (int j = i + 1; j < nums.length; j++) {if (j >= 2 && (j - 1 > i) && nums[j] == nums[j - 1]) {continue;}// 用二分查找, 查找是否存在 值为  -(nums[i]+nums[j]) 的值// 初始下标 k=j+1 , 终止下标: k=nums.length-1 , 且有序int start = j+1 ;int end = nums.length-1;int index = twoSplitSearch(nums, start, end, -(nums[i] + nums[j]));if (index<0){continue;}List<Integer> integers = Arrays.asList(nums[i], nums[j], nums[index]);list.add(integers);}}return list;}// 二分查找public static int twoSplitSearch(int[] ints,int startIndex, int endIndex,int target ){int result = -1;if (startIndex>endIndex){return result;}int mid = (startIndex+endIndex)/2;while (ints[mid]!=target && startIndex<endIndex){if (target > ints[mid]){startIndex=mid+1;}else {endIndex=mid-1;}mid=(startIndex+ endIndex)/2;}if (ints[mid]==target && mid>=startIndex){result=mid;}return result;}
}

自己记录这个解法也只是刚刚通过, 还是很慢, 后面再更新更好的解法。

------------------ 更新-------------------------2024-07-07 --------------------------

【思路3】

同样借助上面思路1的思想, 如果我们对仅仅根据 X 去找另外的2个值  Y, Z, 那样就只要一个for循环,利用双指针的思想。同样,当 X > 0 即可结束最外层的for循环。如图所示:

在这里插入图片描述

public class Solution {public static void main(String[] args) {Solution solution = new Solution();List<List<Integer>> list = solution.threeSum(new int[]{-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6});System.out.println(list);}// 时间复杂度是 o(n^2)public List<List<Integer>> threeSum(int[] nums) {// 默认 x , y, z 由小到大List<List<Integer>> list = new ArrayList<>();// 1. 对数组进行排序Arrays.sort(nums);// 2. 进行遍历for (int i = 0; i < nums.length; i++) {// 如果x>0,则直接结束for循环if (nums[i] > 0) {break;}if (i >= 1 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while (left < right) {int total = nums[left] + nums[right];// 去重判断if (left - 1 > i && nums[left - 1] == nums[left]) {left++;continue;}// 去重判断if (right < nums.length - 1 && nums[right] == nums[right + 1]) {right--;continue;}if (total == -nums[i]) {// 采集结果List<Integer> result = new ArrayList<>();result.add(nums[i]);result.add(nums[left]);result.add(nums[right]);list.add(result);// 那下一步到底是移动左还是右呢?// 尝试左移?// 尝试右移?// 直接左移有指针, 或者右移左指针都可以
//                    left++;right--;} else if (total > -nums[i]) {right--;} else {left++;}}}return list;}
}

到此结束 ~~~

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

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

相关文章

AI集成工具平台一站式体验,零门槛使用国内外主流大模型

目录 0 写在前面1 AI艺术大师1.1 绘画制图1.2 智能作曲 2 AI科研助理2.1 学术搜索2.2 自动代码 3 AI智能对话3.1 聊天机器人3.2 模型竞技场 4 特别福利 0 写在前面 人工智能大模型浪潮滚滚&#xff0c;正推动着千行百业的数智化进程。随着技术演进&#xff0c;2024年被视为是大…

C++11中新特性介绍-之(二)

11.自动类型推导 (1) auto类型自动推导 auto自动推导变量的类型 auto并不代表某个实际的类型&#xff0c;只是一个类型声明的占位符 auto并不是万能的在任意场景下都能推导&#xff0c;使用auto声明的变量必须进行初始化&#xff0c;以让编译器推导出它的实际类型&#xff0c;…

深入探索 Python 中的数据维数:高维数据处理方法与应用

Python 数据维数 在数据科学和机器学习领域&#xff0c;理解数据的维度是至关重要的。Python作为一种强大而灵活的编程语言&#xff0c;提供了丰富的工具和库来处理各种维度的数据。本文将介绍Python中数据维数的概念&#xff0c;以及如何使用Python库来处理不同维度的数据。 什…

算法思想总结:优先级队列

一、最后一块石头的重量 . - 力扣&#xff08;LeetCode&#xff09; 我们每次都要快速找到前两个最大的石头进行抵消&#xff0c;这个时候用优先级队列&#xff08;建大堆&#xff09;,不断取堆顶元素是最好的&#xff01;每次删除堆顶元素后&#xff0c;可以自动调整&#xf…

爬虫怎么实现抓取的

1.4爬虫工程师常用的库通过图1-3我们了解到&#xff0c;爬虫程序的完整链条包括整理需求、分析目标、发出网络请求、文本解析、数据入库和数据出库。其中与代码紧密相关的有&#xff1a;发出网络请求、文本解析、数据入库和数据出库&#xff0c;接下来我们将学习不同阶段中爬虫…

SOAMANAGER 弹不出浏览器

SOAMANAGER 弹不出浏览器 一、打开SOAMANAGER的其他方法 使用事务码SICF打开SOAMANAGER,执行路径default_host/sap/bc/webdynpro/sap/appl_soap_management 使用SE24对类CL_GUI_HTML_VIEWER中的方法DETACH_URL_IN_BROWSER 打断点 在前台创建一个URL的链接。

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

Spring IOC基于XML和注解管理Bean

IoC 是 Inversion of Control 的简写&#xff0c;译为“ 控制反转 ”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出 松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象…

【Unity】在Unity中制作一个小车游戏

目录 第一步&#xff1a;设置Unity项目 第二步&#xff1a;设置场景 第三步&#xff1a;添加车辆控制脚本 第四步&#xff1a;将脚本附加到车辆上 第五步&#xff1a;运行和测试 第六步&#xff1a;添加更多功能&#xff08;可选&#xff09; 在Unity中制作一个小车游戏…

webGL可用的14种3D文件格式,但要具体问题具体分析。

hello&#xff0c;我威斯数据&#xff0c;你在网上看到的各种炫酷的3d交互效果&#xff0c;背后都必须有三维文件支撑&#xff0c;就好比你网页的时候&#xff0c;得有设计稿源文件一样。WebGL是一种基于OpenGL ES 2.0标准的3D图形库&#xff0c;可以在网页上实现硬件加速的3D图…

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序&#xff0c;其中必定有很多辅助内容&#xff0c;这只会增加篇幅&#xff0c;在这里我们更愿意列举一些典型的备份脚本功能&#xff0c;展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…

算法012:将x减到0的最小操作数

将x减到0的最小操作数. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/ 这个题使用到的是滑动窗口。 乍一看&#xff0c…

web安全基础名词概念

本节内容根据小迪安全讲解制作 第一天 域名&#xff1a; 1.1什么是域名&#xff1f; 网域名称(英语&#xff1a;Domain Name&#xff0c;简称&#xff1a;Domain)&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称&a…

【系统架构设计师】八、系统工程基础知识(系统工程|系统性能)

目录 一、系统工程 1.1 系统工程的方法 1.1.1 霍尔的三维结构 1.1.2 切克兰德方法 1.1.3 并行工程方法 1.1.4 综合集成法 1.1.5.WSR 系统方法。 二、系统工程生命周期 2.1 系统工程生命周期7阶段 2.2 生命周期方法 三、基于模型的系统工程(MBSE) 四、系统性能 4.1…

昇思大模型第19天打卡|SSD目标检测

模型简介 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以及59FPS&#xf…

LeetCode 189.轮转数组 三段逆置 C写法

LeetCode 189.轮转数组 C写法 三段逆置 思路: 三段逆置方法:先逆置前n-k个 再逆置后k个 最后整体逆置 由示例1得&#xff0c;需要先逆置1,2,3,4 再逆置5,6,7&#xff0c;最后前n-k个与后k个逆置 代码 void reverse(int*num, int left, int right) //逆置函数 { while(left …

【qt】获取主机信息系统

话不多说,先一睹芳颜! 如果你也想达到这种效果,那咱们就开始吧! 目录 一.登录界面设计1.ui登录设计 二.加载界面1.lineEdit的密码输入模式2.lineEdit按回车跳转的信号3.密码的判断4.创建加载界面5.创建定时器来进行进度条的移动6.定时器执行的槽函数 三.主机信息界面1.主机信息…

阶段三:项目开发---大数据开发运行环境搭建:任务3:安装配置Hadoop集群

任务描述 知识点&#xff1a;安装配置Hadoop 重 点&#xff1a; 安装配置Hadoop 难 点&#xff1a;无 内 容&#xff1a; Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威…

深度卷积神经网络 AlexNet

一、机器学习深度学习的发展 1、机器学习SVM方法 &#xff08;1&#xff09;20世纪90年代&#xff0c;基于统计学习理论的结果&#xff0c;开发了一种新型的学习算法——支持向量机&#xff08;SVM&#xff09;。这就产生了一类新的理论上优雅的学习机器&#xff0c;它们将SVM…

【智能算法应用】灰狼算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#xff0c;可通…