news 2026/6/10 18:33:05

【每日一题】LeetCode 15. 三数之和 TypeScript

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每日一题】LeetCode 15. 三数之和 TypeScript

给你一个整数数组nums,判断是否存在三元组[nums[i], nums[j], nums[k]]满足i != ji != kj != 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

function threeSum(nums: number[]): number[][] { const three:number[][] = [] nums.sort((a,b)=>a-b) for(let i=0;i<nums.length-2;i++){ if(i>0 && nums[i]===nums[i-1]) continue let j=i+1 let z=nums.length-1 while(j<z){ const sum = nums[i]+nums[j]+nums[z] if(sum===0){ three.push([nums[i],nums[j],nums[z]]) while(j<z&&nums[j]===nums[j+1]) j++ while(j<z&&nums[z]===nums[z-1]) z-- j++ z-- }else if(sum>0){ z-- }else{ j++ } } } return three };

如果用暴力解法,三层循环时间复杂度是O(n³),这个算法的目的就是降低时间复杂度+去重

①为什么排序?使重复的值相邻,可以更好地跳过:数组.sort((a,b)=>a-b) 从小到大,升序

②去重:如果下一个值和上一个值相同,直接跳过,i++/j++/z++

注释版:

function threeSum(nums: number[]): number[][] { //初始化声明二维数组,数组嵌套数组 const three:number[][] = [] //从小到大拍寻 nums.sort((a,b)=>a-b) //i是第一个数的下标 //i<length-2 判断条件,比如length=5,i<3,i的值是0,1,2 取不到3 //给j、z腾两个位置 for(let i=0;i<nums.length-2;i++){ //如果重复,continue跳过下面步骤,直接i++ if(i>0 && nums[i]===nums[i-1]) continue //定义一个左指针 let j=i+1 //定义一个右指针 let z=nums.length-1 //两个指针的不重合且一个在左一个在右 while(j<z){ const sum = nums[i]+nums[j]+nums[z] if(sum===0){ //满足条件就push末尾添加 three.push([nums[i],nums[j],nums[z]]) //如果重复,再走一遍循环也是=0,j++移到最后一个相同的值的下标 while(j<z&&nums[j]===nums[j+1]) j++ //z同理 while(j<z&&nums[z]===nums[z-1]) z-- //以上步骤都是j和z都指向相同值得最后一个下标 //指针需要继续移位查找更多的组合 j++ z-- //如果和大了,证明需要更小的数,右指针需要往前移 }else if(sum>0){ z-- //如果和小了,证明需要更大的数,左指针需要往前移 }else{ j++ } } } return three };

共勉,祝天下考生旗开得胜!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 18:30:42

Diablo Edit2:暗黑2存档编辑终极指南,5步打造完美角色

Diablo Edit2&#xff1a;暗黑2存档编辑终极指南&#xff0c;5步打造完美角色 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 还在为暗黑破坏神2中无尽的刷怪和装备收集而烦恼吗&#xff1f;Diabl…

作者头像 李华
网站建设 2026/6/10 18:29:03

i.MX 6UltraLite硬件设计:引脚配置与复位行为详解

1. 项目概述&#xff1a;从引脚图到复位行为&#xff0c;一次搞懂i.MX 6UltraLite的硬件接口设计如果你正在或即将基于NXP的i.MX 6UltraLite这颗汽车级应用处理器进行硬件设计&#xff0c;那么你肯定绕不开两件事&#xff1a;一是看懂那颗密密麻麻的BGA封装引脚图&#xff0c;二…

作者头像 李华
网站建设 2026/6/10 18:27:47

TikTok评论批量采集终极指南:3步获取完整评论数据

TikTok评论批量采集终极指南&#xff1a;3步获取完整评论数据 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 还在为手动复制TikTok评论而烦恼&#xff1f;想要批量获取视频评论数据却不知从何下手&#xf…

作者头像 李华
网站建设 2026/6/10 18:19:22

LeetCode 380:Insert Delete GetRandom O(1) 题解和一些延伸

1. 题干概述 设计一个支持以下操作的数据结构 RandomizedSet&#xff1a; insert(val)&#xff1a;当元素 val 不存在时&#xff0c;向集合中插入该元素&#xff0c;并返回 True&#xff1b;如果已经存在&#xff0c;返回 False。remove(val)&#xff1a;当元素 val 存在时&…

作者头像 李华
网站建设 2026/6/10 18:17:13

基于ComfyUI的AI图像生成实验报告

一、实验引言1.实验目的熟悉千里云平台中ComfyUI节点式工作流的整体结构与核心节点作用&#xff0c;掌握基础文生图工作流搭建、参数设置、正负提示词撰写以及图像生成完整流程。理解LoRA模型加载节点的功能&#xff0c;学会单LoRA与多LoRA组合使用方式&#xff0c;对比基础模型…

作者头像 李华