【JS】双指针法获得满足四数之和且不重复的四元组

思路

本题做法与上一篇三数相加的做法相似,同样是使用双指针法,区别是这里多嵌一层循坏,遍历 i 和 j 的值( j = i + 1),思路可参考笔记:

【JS】双指针法获得满足三数之和且不重复的三元组icon-default.png?t=O83Ahttps://blog.csdn.net/m0_74662483/article/details/143094640?spm=1001.2014.3001.5501

步骤

  1. 检查数组长度:首先检查输入数组 nums 的长度是否小于4,如果是,则直接返回空数组,因为无法形成四元组。

  2. 排序数组:对数组 nums 进行升序排序,这样可以帮助我们在后面使用双指针法时避免重复的组合。

  3. 遍历数组:使用三层嵌套循环来遍历数组,寻找可能的四元组组合。

    1. 第一层循环变量 i 从0开始,到 len - 3 结束,因为每个四元组需要4个不同的数字。
    2. 第二层循环变量 j 从 i + 1 开始,到 len - 2 结束。
  4. 跳过重复元素:在第一层和第二层循环中,如果当前元素与前一个元素相同,则跳过当前迭代,以避免生成重复的四元组。

  5. 初始化左右指针:对于每一对 (i, j),初始化两个指针 leftright,分别指向 j + 1len - 1

  6. 双指针法:使用 while 循环,通过移动 leftright 指针来寻找和为 target 的四元组。

    1. 如果当前四元素之和小于 target,则移动 left 指针到下一个元素。
    2. 如果当前四元素之和大于 target,则移动 right 指针到前一个元素。
    3. 如果当前四元素之和等于 target,则找到了一个有效的四元组,将其添加到结果数组 res 中。
  7. 去重:在找到有效的四元组后,通过两个 while 循环跳过所有重复的元素,以避免在后续的迭代中生成重复的四元组。

  8. 移动指针:在每次找到有效的四元组后,移动 leftright 指针以继续寻找下一个可能的四元组。

  9. 返回结果:遍历结束后,返回包含所有不重复四元组的结果数组 res

题目

示例代码

var fourSum = function (nums, target) {
    const len = nums.length; // 获取数组长度
    if (len < 4) return []; // 如果数组长度小于4,直接返回空数组,因为无法形成四元组

    // 对数组进行排序,以便后续使用双指针法
    nums.sort((a, b) => a - b);
    const res = []; // 初始化结果数组

    // 外层循环,遍历数组的每个元素作为四元组的第一个数
    for (let i = 0; i < len - 3; i++) {
        // 跳过重复元素,以避免生成重复的四元组
        if (i > 0 && nums[i] === nums[i - 1]) continue;

        // 第二个循环,从第一个元素的下一个位置开始,遍历作为四元组的第二个数
        for (let j = i + 1; j < len - 2; j++) {
            // 跳过重复元素
            if (j > i + 1 && nums[j] === nums[j - 1]) continue;

            // 初始化左右指针
            let left = j + 1, right = len - 1;
            // 内层循环,使用双指针法寻找和为 target 的四元组
            while (left < right) {
                let sum = nums[i] + nums[j] + nums[left] + nums[right]; // 计算当前四元组的和
                // 如果和小于 target,移动左指针以增大和
                if (sum < target) {
                    left++;
                } else if (sum > target) { // 如果和大于 target,移动右指针以减小和
                    right--;
                } else {
                    // 如果和等于 target,找到一个有效的四元组
                    res.push([nums[i], nums[j], 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 res;
};

欢迎指正! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git合并多个分支中的提交内容

IDEA中使用 IEAD编辑器中使用Git IEAD编辑器中使用Git 案例一&#xff1a; 把test分支的其中提交的内容合并到main分支上。 你现在通过IDEA开发的分支是test分支&#xff0c;当你在test分支把内容都写完了并且提交内容保存到了本地的git暂存区中的时候&#xff0c;如果此时你的…

【JAVA毕业设计】基于Vue和SpringBoot的员工绩效考核系统

本文项目编号 T 021 &#xff0c;文末自助获取源码 \color{red}{T021&#xff0c;文末自助获取源码} T021&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例分析 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行…

【C语言刷力扣】367.有效的完全平方数

题目&#xff1a; 解题思路&#xff1a; 二分查找 时间复杂度&#xff1a; 空间复杂度&#xff1a; bool isPerfectSquare(int num) {int l 0, r 50000;while (l < r) {long long mid (l r) / 2;if (num < mid * mid) {r mid - 1;}else if (num > mid*mid) …

【番外】软件设计师中级笔记关于数据库技术更新笔记问题

提问 由于软件设计师中级笔记中第九章数据库技术基础的笔记内容太多&#xff0c;我应该分几期发布呢&#xff1f;还是一期一次性发布完成。 如果分为一期发布&#xff0c;可能需要给我多一些时间&#xff0c;由于markdown格式有所差异&#xff0c;所以我需要部分进行修改与调…

单链表的经典算法OJ

目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…

企业级 RAG 全链路优化关键技术

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 邢少敏 | 阿里云智能集团高级技术专家 活动&#xff1a; 2024 云栖大会 - AI 搜索企业级 RAG 全链路优化关键技术 在2024云栖大会上&#xff0c;阿里云 AI 搜索研发负责人之一的…

基于微博评论的自然语言处理情感分析

目录 一、项目概述 二、需要解决的问题 三、数据预处理 1、词汇表构建&#xff08;vocab_creat.py&#xff09; 2、数据集加载&#xff08;load_dataset.py&#xff09; 四、模型构建&#xff08;TextRNN.py&#xff09; 1、嵌入层&#xff08;Embedding Layer&#xff…

【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)

目录 零.前置篇章 一.Cmake的由来 二.安装 三.创建并编写CMakeLists.txt 四.编译 五.优化CMakeLists.txt文件 零.前置篇章 【Linux快速入门(一)】Linux与ROS学习之编译基础&#xff08;gcc编译&#xff09;_ros linux-CSDN博客【Linux快速入门(二)】Linux与ROS学习之编译…

hadoop_hdfs详解

HDFS秒懂 HDFS定义HDFS优缺点优点缺点 HDFS组成架构NameNodeDataNodeSecondary NameNodeClient NameNode工作机制元数据的存储启动流程工作流程 Secondary NameNode工作机制checkpoint工作流程 DataNode工作机制工作流程数据完整性 文件块大小块太小的缺点块太大的缺点 文件写入…

高中数学网盘资料(每题有解析和知识点)

一、究极超能学习资源高中版 一数作为播放量过亿的哔站up实力非同一般 链接&#xff1a;https://pan.baidu.com/s/1xrcAlq6wj_LMYHcbxAKAWg 提取码&#xff1a;7MBW 复制这段内容打开「百度网盘APP 即可获取」 二、必刷题高考合订本&#xff08;刷题必备&#xff09; 链接&am…

MongoDB的基本操作

&#x1f337;数据库准备 &#x1f388;Mongoshell 1.在指定目录下创建mongodb文件夹、其子文件log和data以及mongodb.log cd /home/ubuntu mkdir -p mongodb/data mkdir -p mongodb/log touch mongodb/log/mongodb.log 执行mongodb命令启动mongdb服务 mongod --dbpath /h…

如何利用 OCR 和文档处理,快速提高供应商管理效率 ?

在当今瞬息万变的商业环境中&#xff0c;有效的供应商管理通常需要处理大量实物文档&#xff0c;这带来了巨大的挑战。手动提取供应商名称、编号和其他关键信息等关键细节非常耗时、容易出错&#xff0c;并且会降低整体效率。 为了应对这些挑战&#xff0c;组织正在逐步采用自…

ImportError: numpy.core.multiarray failed to import

ImportError: DLL load failed while importing _multiarray_umath: 找不到指定的模块。 Traceback (most recent call last): File "E:\python_code\Smart_store\test_20241021\test03.py", line 1, in <module> import cv2 File "E:\anaconda3\…

信息安全工程师(60)计算机病毒分析与防护

计算机病毒分析 介绍 计算机病毒是一种人为制造的程序&#xff0c;它通过不同的途径潜伏或寄生在存储媒体&#xff08;如磁盘、内存&#xff09;或程序里。当某种条件或时机成熟时&#xff0c;它会自生复制并传播&#xff0c;使计算机的资源受到不同程度的破坏。 定义&#xf…

7、Vue2(二) vueRouter3+axios+Vuex3

14.vue-router 3.x 路由安装的时候不是必须的&#xff0c;可以等到使用的时候再装&#xff0c;如果之前没有安装的话&#xff0c;可以再单独安装。之前的终端命令行不要关闭&#xff0c;再重新开一个&#xff0c;还需要再package.json文件的依赖中添加。 如果忘记之前是否有安…

PPT自动化:Python如何修改PPT文字和样式!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 使用 Python 修改 PPT 文本内容📝 遍历所有幻灯片和文本框📝 设置和修改文本样式📝 复制和保留文本样式⚓️ 相关链接 ⚓️📖 介绍 📖 在日常工作中,PPT 的文字内容和样式修改似乎是一项永无止境的…

向日葵密码提取

向日葵密码提取 首先可以通过tasklist /svc来找一下程序PID 通过procdump来提取内存中的数据&#xff0c;从而从中提取密码。例如fastcode部分可以找到设备识别码&#xff0c; 临时密码会放在一个<f>标签中。 工具化 可以把工具用python语言自动化来做&#xff0c;…

SSD-Pytorch环境搭建(二)

系列文章目录 SSD-Pytorch环境搭建&#xff08;一&#xff09; SSD-Pytorch环境搭建&#xff08;二&#xff09; 文章目录 系列文章目录前言一、训练步骤1、本文使用VOC格式进行训练。2、训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。 3、训练前将…

自己掏耳朵怎么弄干净?清洁耳朵掏耳神器推荐!

耳屎是人体的分泌物之一&#xff0c;很多人选择用传统挖耳勺或者棉签进行掏耳&#xff0c;殊不知这种行为会将耳屎越捅越深&#xff0c;甚至还会捅穿鼓膜&#xff01;那么缺少别人帮助的情况下&#xff0c;自己掏耳朵怎么弄干净呢&#xff1f;现在小编就给大家分享一款掏耳神器…

家庭事务管理系统|基于java和vue的家庭事务管理系统设计与实现(源码+数据库+文档)

家庭事务管理系统 目录 基于java和vue的家庭事务管理系统 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c;阿里云…