当前位置: 首页 > news >正文

学习记录:js算法(十六):四数之和

文章目录

    • 四数之和
      • 我的思路
    • 总结

四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target
请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  1. 0 <= a, b, c, d < n
  2. a、b、c 和 d 互不相同
  3. nums[a] + nums[b] + nums[c] + nums[d] == target
  4. 可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

我的思路
昨天写了三数之和,今天写四数,那肯定要使用不熟练的指针写法了。
网上思路
如上

我的思路

var fourSum = function (nums, target) {nums.sort((a, b) => a - b);const res = new Set();const n = nums.length;for (let i = 0; i < n - 3; i++) {for (let j = i + 1; j < n - 2; j++) {let left = j + 1;let right = n - 1;while (left < right) {const sum = nums[i] + nums[j] + nums[left] + nums[right];if (sum === target) {res.add(`${nums[i]},${nums[j]},${nums[left]},${nums[right]}`);left++;right--;} else if (sum < target) {left++;} else {right--;}}while (j + 1 < n && nums[j] === nums[j + 1]) {j++;}}while (i + 1 < n && nums[i] === nums[i + 1]) {i++;}}return Array.from(res).map(quad => quad.split(',').map(Number));
}

讲解

  1. 对输入的数组 nums 进行 排序和去重 。是为了后续的双指针操作以及避免重复四元组的出现。
  2. 外层循环 i 从 0 到 n - 3,目的是 固定第一个数 nums[i]内层循环 j 从 i + 1 到 n - 2,目的是 固定第二个数 nums[j]。这样,就有了两个固定的数,接下来要寻找四个数中剩下的两个数。
  3. 定义两个指针 leftright,分别指向 当前固定数 j 之后的第一个元素数组的最后一个元素。然后通过 while (left < right) 循环 来寻找满足条件的四元组。
  4. 在循环中,需要计算当前四个数的和 sum
    • 如果 sum 等于目标值 target,则将这个四元组添加到 Set 中,并移动 leftright 指针,寻找其他可能的组合。
    • 如果 sum 小于目标值,说明我们需要更大的数,因此移动 left 指针向右。
    • 如果 sum 大于目标值,说明需要更小的数,因此移动 right 指针向左。
  5. 在每次内层循环结束后,需要跳过重复的元素,以确保不会得到重复的四元组。这个逻辑适用于 外层循环的 i 和内层循环的 j
  6. Set 中的字符串转换为数组形式。使用 Array.from(res)Set 转换为数组,然后用 map 方法将每个字符串分割成数字数组。

总结

今天特地用双指针的写法来解题的,说实话,我想了老半天,才在别人的代码下写出来的。。。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 渗透课程第二阶段--Part8--XXE渗透与防御
  • 激活函数的创新之旅:在PyTorch中自定义激活函数
  • 常用PHP JS MySQL 常用方法记录
  • TCP三次握手过程详解
  • Shell编程规范与变量:详解环境变量、位置变量与预定义变量
  • Java 入门指南:Java IO流 —— 序列化与反序列化
  • centos7 xtrabackup mysql(8)压缩 全量备份 还原(4)
  • 加速网络体验,Squid缓存代理:让浏览如飞,畅享无限网络速度!
  • 计算机专业的真正的就业情况
  • C语言 | Leetcode C语言题解之第375题猜数字大小II
  • 02-03:原理图与PCB交互以及快速模块化
  • E - Red Polyomino 关于回溯 和爆搜
  • 入门STM32--按键输入
  • 排队辅助功能二手车,全速自适应巡航
  • 适应CLIP作为图像去雾的聚合指导
  • .pyc 想到的一些问题
  • FineReport中如何实现自动滚屏效果
  • Java-详解HashMap
  • Java应用性能调优
  • jquery ajax学习笔记
  • mysql中InnoDB引擎中页的概念
  • Netty源码解析1-Buffer
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring框架之我见(三)——IOC、AOP
  • Vue官网教程学习过程中值得记录的一些事情
  • 对象管理器(defineProperty)学习笔记
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 简单基于spring的redis配置(单机和集群模式)
  • 看域名解析域名安全对SEO的影响
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 算法-图和图算法
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​香农与信息论三大定律
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (06)Hive——正则表达式
  • (3) cmake编译多个cpp文件
  • (35)远程识别(又称无人机识别)(二)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二)c52学习之旅-简单了解单片机
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转载)(官方)UE4--图像编程----着色器开发
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Framework .NET Core与 .NET 的区别
  • .net下简单快捷的数值高低位切换
  • .Net中的集合
  • .net专家(张羿专栏)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复