leetcode刷题:三数之和

题目:

给你一个整数数组 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
-105 <= nums[i] <= 105

解题思路:

暴力法搜索时间复杂度为 O( N 3 N^3 N3),可通过双指针动态消去无效解来优化效率。

算法流程:

  1. 先将 nums 排序,时间复杂度为 O( N l o g N NlogN NlogN)。

  2. 固定 3 个指针中最左(最小)元素的指针 k,双指针 i,j 分设在数组索引 ( k , l e n ( n u m s ) k,len(nums) k,len(nums))两端。

  3. 双指针 i, j 交替向中间移动,记录对于每个固定指针 k 的所有满足 nums[k] + nums[i] + nums[j] == 0 的 i,j 组合:

    • 当 nums[k] > 0 时直接break跳出:因为 nums[j] >= nums[i] >= nums[k] > 0,即 3 个元素都大于 0 ,在此固定指针 k 之后不可能再找到结果了。
    • 当 k > 0且nums[k] == nums[k - 1]时即跳过此元素nums[k]:因为已经将 nums[k - 1] 的所有组合加入到结果中,本次双指针搜索只会得到重复组合。
    • i,j 分设在数组索引 ( k , l e n ( n u m s ) k,len(nums) k,len(nums)) 两端,当i < j 时循环计算s = nums[k] + nums[i] + nums[j],并按照以下规则执行双指针移动:
      • 当s < 0时,i += 1并跳过所有重复的nums[i];
      • 当s > 0时,j -= 1并跳过所有重复的nums[j];
      • 当s == 0时,记录组合[k, i, j]至res,执行i += 1和j -= 1并跳过所有重复的nums[i]和nums[j],防止记录到重复组合。

代码:

class Solution {public List<List<Integer>> threeSum(int[] nums) {//数组从小到大排序Arrays.sort(nums);int len = nums.length;List<List<Integer>> res = new ArrayList<>();for(int i = 0; i < len -2; i++){//如果最小的数大于0则不可能三个数的和为0, 直接退出if(nums[i] > 0){break;}//如果和上一个数相同,则有重复解。//即当a = d时,a + b + c = d + b + c = 0, 寻找下一个不同的数(简称:去重)if(i > 0 && nums[i] == nums[i-1]){    //i > 0是因为可能i = 0时去重出现异常continue;}//取另外两个数,判断三数之和是否为0int j = i + 1, k = len - 1;int sum;while(j < k){sum = nums[i] + nums[j] + nums[k];//如果三数之和大于0,则说明最大数nums[k]太大了,k向左移,同时去重if(sum > 0){while(j < k && nums[k] == nums[--k]);//如果三数之和小于0,则说明中间数nums[j]太小了,j向右移,同时去重}else if(sum < 0){while(j < k && nums[j] == nums[++j]);//如果三数之和等于0, 则把三数添加到答案}else{res.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[j], nums[k])));//nums[j]增大, nums[k]减小, 依旧可能满足三数之和为0,继续遍历去重while(j < k && nums[k] == nums[--k]);while(j < k && nums[j] == nums[++j]);}}}return res;}
}

复杂度分析:

  • 时间复杂度 O( N 2 N^2 N2):其中固定指针k循环复杂度 O(N),双指针 i,j 复杂度 O( N N N)。
  • 空间复杂度 O( 1 1 1):指针使用常数大小的额外空间。

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

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

相关文章

mac android studio 首次无法连接安卓手机

缺少安卓手机需要的驱动&#xff0c;通过安装驱动解决 macport install android-platform-tools 在macOS上安装Android平台工具&#xff0c;可以使用Homebrew或者MacPorts。以下是使用MacPorts安装Android平台工具的步骤&#xff1a; 打开终端。 输入以下命令来安装Android平…

并行执行的概念—— 《OceanBase 并行执行》系列 一

From 产品经理&#xff1a; 这是一份姗姗来迟的关于OceanBase并行执行的系统化产品文档。 自2019年起&#xff0c;并行执行功能已被许多客户应用于多种场景之中&#xff0c;其重要性日益凸显。然而&#xff0c;遗憾的是&#xff0c;我们始终未能提供一份详尽的用户使用文档&…

initramfs及rpm/dracut操作

一、背景 更新bundle包后发现系统异常。 定位发现驱动升级不成功&#xff0c;内核启动后加载的还是更新前的旧驱动。但等内核启动完成后&#xff0c;卸载旧驱动手动insmod新驱动&#xff0c;是可以加载成功的。 驱动的安装目录在/lib/modules/$KERNELVERSION/extra目录下。 …

VMware下Ubuntu的安装教程

文章目录 一、Ubuntu如何下载1.下载官方地址https://ubuntu.com/2.点选Ubuntu服务器版本3.点击下载Ubuntu服务器版本iso镜像二、VMware安装Ubuntu服务器系统1.创建虚拟机2.选择下载好的Ubuntu服务器镜像3.创建安装完成三、Ubuntu Server如何设置1.Ubuntu Server没有中文所以全都…

突破AI迷雾:英特尔携手星环科技打造向量数据库革新方案,直降大模型幻觉

去年爆火的大模型&#xff0c;正在从百模大战走向千行百业落地应用。不过行业数据规模有限&#xff0c;企业数据隐私安全的要求等等因素&#xff0c;都让行业大模型的准确率面临挑战。近期发布的《CSDN AI 开发者生态报告》数据显示&#xff0c;“缺乏数据/数据质量问题”在大模…

CSS优先级的大小计算方式

CSS优先级是用来确定多个CSS规则应用于同一个元素时的顺序。计算CSS优先级遵循以下规则&#xff1a; 在CSS规则中使用的选择器越具体&#xff0c;优先级越高。选择器的具体性是通过选择器的组成部分进行计算的。 ID选择器比属性选择器和类选择器具有更高的优先级。类选择器和属…

Pycharm远程同步的mapping与sync

用Pycharm进行项目远程部署的时候会遇到两个同步文件&#xff0c;一个是点击 tools—>deployment—>configration——>mapping 一个是链接虚拟环境的时候会有一个sync&#xff0c;那么这两种同步有什么区别呢&#xff1f; 区别就是&#xff0c;2包括1&#xff0c;要用…

常见错误以及如何纠正它们

团队和关键结果目标 (OKR) 之间的关系是深刻且至关重要的。总而言之&#xff0c;一切都应该是相互关联的。正如《团队的智慧》一书中所强调的&#xff1a; 在团队中&#xff0c;没有什么比每个成员对共同目标和一组相关绩效目标的承诺更重要的了&#xff0c;而团队对此负有共同…

【热门话题】实用Chrome命令:提升前端开发效率的利器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 实用Chrome命令&#xff1a;提升前端开发效率的利器引言目录1. 快速打开Chrome …

Django调用MTP服务器给指定邮箱发送邮件

Django调用MTP服务器发送邮箱 邮箱的激活链接含有用户数据不能直接发送需要对其进行加密 发送邮箱是借助SMTP服务器进行中转 一. 配置SMTP服务中的邮箱信息以及激活链接 1. 配置邮箱权限 打开网易邮箱设置点击POP3 开启选项 注 : 在打开的过程中会弹出授权密码一点要保存 …

C++ 递归函数

一 递归函数 递归函数(Recursive Function&#xff09;即自调用函数&#xff0c;即在函数体内有直接或间接地自己调用自己的语句。 大多数递归函数都能够用非递归函数代替。 例如&#xff1a;求两个整数a,b的最大公约数。 算法描述&#xff1a; 大多数递归函数都能用非递归…

Angular中组件之间的传值

Angular中组件之间的传值 文章目录 Angular中组件之间的传值前言一、父亲向儿子传值二、儿子向父亲传值三、爷爷向孙子传值四、兄弟之间的传值 前言 Angular的组件是构成应用的基础单元&#xff0c;它们封装了HTML模板、TypeScript代码以及CSS样式&#xff0c;以实现特定的功能…

rag-embeddings基础流程

什么是检索增强的生成模型 LLM 固有的局限性 LLM 的知识不是实时的LLM 可能不知道你私有的领域/业务知识 检索增强生成 RAG&#xff08;Retrieval Augmented Generation&#xff09;顾名思义&#xff0c;通过检索的方法来增强生成模型的能力。 类比&#xff1a;你可以把这个…

Day 27 MySQL的权限管理

权限管理 grant权限管理 向用户开放全局&#xff0c;某个库及库内的表&#xff0c;特定的某个库内的某个表的权限时&#xff0c;使用grant 格式 grant 权限 on 库.表 to ‘用户’‘允许登录的主机’ identified by ‘密码’; 实例 grant all (privileges) on . to ‘root’…

AIGC相关的编程题目【初级题目】1. 文本生成器 2. 图像标签生成

1. 文本生成器 编写一个程序&#xff0c;使用预先训练的语言模型&#xff08;如GPT-2或GPT-3&#xff09;来生成文本。用户输入一个单词或短语作为提示&#xff0c;程序输出一段继续该提示的文本。 import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer# 加…

CTK库编译-01

地址 官网地址&#xff1a;Commontk github地址&#xff1a;https://github.com/commontk/CTK 编译环境 Qt套件&#xff1a; IDE&#xff1a;VS2022 使用vs2022 文件->打开->cmake 修改根目录下的CMakeLists.txt 默认只编译core模块&#xff0c;所以需要把部分模块…

一文读懂Python的`__init__`,`__init__`方法的终极指南

大家好&#xff0c;今天给大家介绍一个Python中一个特殊的函数__init__。 在Python中&#xff0c;__init__方法是一个特殊的函数&#xff0c;它在创建类的新实例时自动调用。它的作用类似于其他编程语言中的构造函数&#xff0c;用于初始化对象的状态。这篇文章将带你深入了解…

资料总结分享:SAM,bam,bed文件格式

目录 sam文件 bam文件 bed 文件 sam文件 SAM&#xff08;Sequence Alignment/Map&#xff09;文件是存储测序数据比对结果的一种常见格式。SAM文件通常用于存储DNA或RNA测序数据在参考基因组上的比对结果。 SAM文件由多行文本组成&#xff0c;每一行代表一个比对结果。SAM文…

QX-mini51学习---(2)点亮LED

目录 1什么是ed 2led工作参数 3本节相关原理图分析 4本节相关c 5实践 1什么是ed 半导体发光二极管&#xff0c;将电能转化为光能&#xff0c;耗电低&#xff0c;寿命长&#xff0c;抗震动 长正短负&#xff0c;贴片是绿点处是负极 2led工作参数 3本节相关原理图分析 当…

Python使用with语句管理文件上下文

使用 with 语句管理文件上下文是 Python 中一种常见的文件操作方式&#xff0c;它能够自动管理文件的打开和关闭&#xff0c;使得文件操作更加简洁、安全和可靠。本文将详细介绍如何使用 with 语句管理文件上下文&#xff0c;包括语法、用法、优势以及示例等内容。 一、with 语…