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

2024-08-28 08:04

本文主要是介绍学习记录: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 方法将每个字符串分割成数字数组。

总结

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

这篇关于学习记录:js算法(十六):四数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114194

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于