学习记录:js算法(十五):三数之和

news/2024/9/14 0:41:29/ 标签: 算法, 学习, javascript

文章目录

    • 三数之和
      • 我的思路
      • 网上思路
    • 总结

三数之和

给你一个整数数组 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

我的思路
本来想用双指针来写的,但是没有思路,就老规矩,循环
网上思路
双指针

我的思路

var threeSum = function (nums) {let arr = []let len = nums.lengthfor (let i = 0; i < len - 2; i++) {for (let j = i + 1; j < len - 1; j++) {for (let k = i + 2; k < len; k++) {if (nums[i] + nums[j] + nums[k] == 0 && i != j && i != k && j != k) {arr.push([nums[i], nums[j], nums[k]])}}}}arr.forEach(item => {item.sort((a, b) => (a - b))})let b = [...new Set(arr.map(JSON.stringify))].map(JSON.parse)return b
};

讲解

  1. 注意一下每次循环的长度就行了,因为 j 从 i 后面一位开始,同时 j 后面还有一个 k,所以范围: i+1 ~ len-1,同理 k 的范围:i+2 ~ len
  2. 题目要求去重,但是 使用 new Set([ [1,2] , [1,2] , [2,3] ] )去重不起效果,得将 [ [1,2] , [1,2] , [2,3] ]修改成[ “[1,2]” , “[1,2]” , “[2,3]” ]

网上思路

function threeSum(nums) {nums.sort((a, b) => a - b); // 对数组进行排序const result = [];for (let i = 0; i < nums.length - 2; i++) {// 跳过重复的元素if (i > 0 && nums[i] === nums[i - 1]) continue;let left = i + 1;let right = nums.length - 1;while (left < right) {const total = nums[i] + nums[left] + nums[right];if (total < 0) {left++; // 和小于0,移动左指针增大和} else if (total > 0) {right--; // 和大于0,移动右指针减小和} else {// 找到一个三元组result.push([nums[i], nums[left], nums[right]]);// 跳过重复的元素while (left < right && nums[left] === nums[left + 1]) {left++;}while (left < right && nums[right] === nums[right - 1]) {right--;}// 移动指针left++;right--;}}}return result;
}

讲解

  1. 排序:使用 sort 方法对数组进行排序。这一步是关键,因为排序后我们可以更容易地避免重复并使用双指针方法
  2. 遍历:通过一个 for 循环遍历每个元素,作为三元组的第一个元素。
    外层循环: 遍历每个元素 i,从第一个元素到倒数第三个元素(因为我们需要找到两个其他元素)。
    跳过重复: 如果当前元素与前一个元素相同,跳过当前循环。这是为了避免在结果中出现重复的三元组。
  3. 双指针:定义两个指针 left 和 right,分别指向当前元素的下一个位置和数组的最后一个位置。
  4. 条件判断:根据三数之和的值来调整指针的位置,并在找到符合条件的三元组后,跳过重复的元素。
    • 如果 total < 0,说明需要更大的值,移动 left 指针向右。
    • 如果 total > 0,说明需要更小的值,移动 right 指针向左。
    • 如果 total === 0,说明找到了一个三元组,将其加入到结果数组中。
  5. 返回结果:最终返回所有找到的三元组。

总结

看来对双指针的学习还不够,还得找类似的题目多练练。


http://www.ppmy.cn/news/1516454.html

相关文章

win/mac视频剪辑软件Premiere Pro 2024下载安装

目录 一、简介 &#xff08;一&#xff09;高级调色功能 &#xff08;二&#xff09;字幕制作 &#xff08;三&#xff09;与其他 Adobe 软件的协同工作 下载 二、安装 &#xff08;一&#xff09;安装前的准备工作 &#xff08;二&#xff09;安装过程中的常见问题及解…

前端面试宝典【CSS篇】【8】

在前端开发的世界里,每一次面试都是一次机遇,也是一次挑战。 你是否曾因技术深度不够而错失良机? 或是面对最新的技术趋势感到迷茫? 我们的【前端面试宝典】正是为此而来。 由拥有多年一线实战经验的资深工程师亲自授课,结合最新的行业动态与实战案例,旨在全面提升你的技…

【算法进阶2-动态规划】斐波那契数列(递归调用、动态规划)、钢条切割问题(自定而下实现、自底向上、切割方案)

1 斐波那契数 2 钢条切割问题 2.1 最优解情况 2.2 钢条切割问题之自定而下实现 2.3 钢条切割问题之自底向上实现 2.4 钢条切割问题-重构解-切割方案 1 斐波那契数 # 1 子问题的重复计算 def fibonacci(n: int) -> int:"""使用递归方式计算第 n 个斐波那契数…

美国高防服务器测评

美国高防服务器通常具有出色的硬件配置和网络性能&#xff0c;以及强大的DDoS防御能力。rak小编为您整理发布美国高防服务器测评。 美国高防服务器因其地理位置和网络基础设施的优势&#xff0c;通常被认为在防御分布式拒绝服务(DDoS)攻击方面具有较高的能力。面对日益增长的网…

基于R语言遥感随机森林建模与空间预测

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

力扣: 两两交换链表中的节点

文章目录 需求代码代码解释结尾 需求 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;…

工厂模式与策略模式:理解与应用

工厂模式与策略模式&#xff1a;理解与应用 1. 引言2. 工厂模式简介2.1 定义2.2 特点2.3 应用场景2.4 工厂模式例子&#xff1a;咖啡制作 3. 策略模式简介3.1 定义3.2 特点3.3 应用场景3.4 策略模式例子&#xff1a;咖啡定价 4. 区别4.1 目的不同4.2 应用场景不同4.3 解决问题不…

浅谈Java Maven

一、基本介绍 Maven是Java项目的构建工具&#xff0c;通过项目对象模型&#xff08;POM&#xff09;管理项目配置信息&#xff0c;自动化构建、测试和部署过程。开发人员可定义项目结构、依赖和构建流程&#xff0c;提高开发效率和质量。本文介绍基本概念和用法&#xff0c;帮助…

【YOLOv8改进[Conv]】 感受野注意力卷积RFAConv(2024.3)| 使用RFAConv改进目标检测效果 + 含全部代码和详细修改方式

本文将进行在YOLOv8中使用 感受野注意力卷积RFAConv改进v8 的实践,助力YOLOv8目标检测效果,文中含全部代码、详细修改方式。助您轻松理解改进的方法。

时尚图像编辑

时尚图像编辑是一种应用计算机视觉和机器学习技术来改变或增强时尚摄影图像的领域。这种编辑可以包括更改服装颜色、形状或整体风格&#xff0c;以及调整模特在图像中的姿态或场景背景。 在您提到的背景中&#xff0c;现有的时尚图像编辑方法依赖于如分割器和关键点提取器这样…

FreeRTOS学习笔记>中断管理

1. 异常的定义与分类 异常&#xff1a;是指任何导致处理器脱离正常执行路径、并转向执行特定代码的事件。异常如果不及时处理&#xff0c;可能导致系统错误甚至瘫痪&#xff0c;因此异常处理对于系统的稳定性和鲁棒性非常重要&#xff0c;特别是在实时系统中。异常分类&#x…

【markdown 中的文字颜色设置】按色系分类

文本颜色分类 蓝绿色系:灰色系:蓝紫色系:粉色系:绿色系:橘棕色系:语法,以天蓝色为例: <font color=skyblue>我是文字</font>我是文字 或者 替换成对应的16进制 <font color=#87CEEB>同理</font>同理 接下来是按色系分类的颜色名 蓝绿色系: …

速盾:前端cdn加速是什么意思?

前端CDN加速是指通过使用内容分发网络&#xff08;CDN&#xff09;来加速前端页面加载和内容访问的一种技术手段。CDN是一种分布式架构的网络&#xff0c;通过将内容缓存到离用户更近的服务器节点上&#xff0c;可以有效地减少网络延迟&#xff0c;并提高页面加载速度和用户体验…

Golang测试func TestXX(t *testing.T)的使用

一般Golang中的测试代码都以xxx_test.go的样式&#xff0c;在命名测试函数的时候以Testxx开头。 以下是我写的一个单元&#xff1a; package testsimport "strings"func Split(s, sep string) (res []string) {i : strings.Index(s, sep)for i > -1 {res append…

ASAM OpenX系列标准

ASAM OpenX系列标准是由德国自动化及测量系统标准协会&#xff08;ASAM&#xff09;制定的一系列标准&#xff0c;旨在推动自动驾驶仿真测试领域的发展。该系列标准涵盖了仿真测试场景的不同方面&#xff0c;为自动驾驶技术的研发、测试和验证提供了统一的规范和框架。以下是对…

Dopamine(多巴胺)越狱工具一键越狱教程:支持 iOS 15-iOS 16.6.1 设备

Dopamine&#xff08;多巴胺&#xff09;越狱工具由巨魔商店 TrollStore 的作者 opa334 联合 ellekit 开发&#xff0c;是公开的一个开源越狱工具&#xff0c;面向所有人员使用。用户可通过爱思助手“一键越狱”安装此工具进行越狱&#xff0c;操作更加便捷&#xff0c;以下是相…

ffmpeg教程及加速视频转码

ffmpeg教程及加速视频转码 1、ffmpeg简介&#xff1a; ffmpeg来自MPEG视频编码标准。 是一套可以用来记录&#xff0c;转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。 可以轻易的实现多种视频格式之间的相互转换。 2、基础知识&#xff1a; 容器、文件…

ZooKeeper--基于Kubernetes部署ZooKeeper

ZooKeeper 服务 服务类型: 无头服务&#xff08;clusterIP: None&#xff09;&#xff0c;这是 StatefulSet&#xff08;有状态集&#xff09;必需的配置。 端口: 2181 (客户端): 用于客户端连接。 2888 (跟随者): 用于 ZooKeeper 服务器之间的连接。 3888 (领导者): 用于领导者…

多平台谷歌浏览器驱动下载地址分享

多平台谷歌浏览器驱动下载地址分享 一、概述二、windows、linux、mac平台下载地址2.1windows平台下载地址2.2linux、mac平台下载地址 三、arm平台下载地址参考文档 一、概述 在使用一些自动化网页测试工具时&#xff0c;往往需要下载谷歌浏览器驱动文件&#xff0c;用于配合工…

虚幻5|按键触发学习

一&#xff0c;如图参考 1.下移 驱动阈值 越大按时间长才会触发&#xff0c;越小很快就可以触发 2.按下 当按下超出驱动阈值大小就会触发一次&#xff0c;这里的驱动阈值只能设置再0.1~1的大小 3.已松开 当按下的时候&#xff0c;先触发单次的started&#xff0c;如果按压…