首页 > 编程语言 >写一个算法找到数组中两个元素相加等于指定数的所有组合

写一个算法找到数组中两个元素相加等于指定数的所有组合

时间:2024-12-15 09:45:16浏览次数:9  
标签:Set const 相加 元素 算法 num 数组 complement

在前端开发中,我们可以使用 JavaScript 来实现一个算法,该算法能够找到数组中两个元素相加等于指定数的所有组合。下面是一个示例代码:

/**
 * 找到数组中两个元素相加等于指定数的所有组合
 * @param {number[]} nums - 输入数组
 * @param {number} target - 目标和
 * @returns {Array<[number, number]>} - 满足条件的元素组合
 */
function findPairsWithSum(nums, target) {
    const result = [];
    const numSet = new Set(nums); // 使用 Set 来快速查找元素是否存在

    nums.forEach(num => {
        const complement = target - num;
        if (numSet.has(complement) && num !== complement) {
            result.push([num, complement]);
        }
    });

    // 去除重复的组合(例如 [1, 2] 和 [2, 1])
    const uniqueResult = Array.from(new Set(result.map(JSON.stringify)), JSON.parse);

    return uniqueResult;
}

// 示例用法
const nums = [2, 7, 11, 15, 1, 9, 3, 6];
const target = 9;
const pairs = findPairsWithSum(nums, target);
console.log(pairs); // 输出 [[1, 8], [2, 7], [3, 6]]

代码解释

  1. 输入参数

    • nums:输入的数组,包含要查找的元素。
    • target:目标和,即两个元素相加应该等于这个值。
  2. 结果数组

    • result:用于存储满足条件的元素组合。
  3. Set数据结构

    • numSet:使用 Set 来存储数组中的元素,以便快速查找元素是否存在。
  4. 遍历数组

    • 使用 forEach 遍历数组中的每个元素 num
    • 计算 num 的补数 complement,即 target - num
    • 检查 complement 是否存在于 numSet 中,并且 numcomplement 不相同(避免同一个元素被计算两次,例如 [4, 4])。
  5. 去除重复组合

    • 使用 SetJSON.stringify 来去除重复的组合。因为 Set 只能存储原始值,所以先将组合转换为字符串,再存储到 Set 中,最后再将字符串转换回数组。
  6. 返回结果

    • 返回满足条件的唯一组合。

注意事项

  • 在处理大数据集时,这种方法的性能可能会受到影响,因为它依赖于 SetforEach。如果性能是一个关键问题,可以考虑使用更高效的算法,例如哈希表。
  • 示例中的数组 [2, 7, 11, 15, 1, 9, 3, 6] 和目标和 9 只是为了演示,可以根据需要替换为其他数据。

希望这个算法对你有所帮助!

标签:Set,const,相加,元素,算法,num,数组,complement
From: https://www.cnblogs.com/ai888/p/18607635

相关文章

  • 写一个方法js将数组对象中某个属性值相同的对象合并成一个新对象
    在前端开发中,处理数组对象并合并具有相同属性值的对象是一个常见的需求。以下是一个使用JavaScript实现的方法,将数组对象中某个属性值相同的对象合并成一个新对象。假设我们要合并的属性名为keyField,并且我们希望将其他属性的值合并为一个数组。/***合并数组中具有相同属性......
  • 【C++算法】42.模拟_数青蛙
    文章目录题目链接:题目描述:解法C++算法代码:题目链接:1419.数青蛙题目描述:解法模拟:利用一个指针,从前往后遍历,遍历到r就看前面有没有c,遍历到o就看前面有没有r。建立一个哈希表记录每一个字符出现的情况。比如:先出现c,哈希表里c的值是1出现r后,c的值-1,r的......
  • 树状数组详解
    概述树状数组(BinaryIndexedTree,简称BIT),是一种数据结构,用于处理区间查询和更新问题。它是一种可以高效地在对数级别时间复杂度内进行单点更新和区间查询的数据结构。树状数组通常用于解决以下两类问题:区间和查询:给定一个序列,查询序列中任意区间的和。区间更新:给定一个序......
  • 【力扣算法】234.回文链表
    快慢指针:一个指针走两步,一个指针走一步,当快指针走到链表末尾时,慢指针走到中间位置。 逆转链表:根据指针位置分成两个表,逆转第二个表。按序判断就可以,如果是相同就是回文,反之就不是。快慢指针能找链表中间,也可以判断链表是否有环/***Definitionforsingly-linkedlist.......
  • IPVS(LVS)中的调度算法详解(一)
    一、IPVS中的算法类型IPVirtualServerversion1.2.1kernel6.6.0-28.0.0.34.oe2403.x86_64--scheduler-sscheduleroneofrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh,当前版本的LVS共有rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh,共13种算法......
  • 最短路----Dijkstra算法详解
    简介迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格·迪科斯彻(EdsgerDijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法,每次遍历......
  • 【每日一题】3266. K 次乘运算后的最终数组 I&II
    给你一个整数数组 nums ,一个整数 k  和一个整数 multiplier 。你需要对 nums 执行 k 次操作,每次操作中:找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。将 x 替换为 x*multiplier 。k 次操作以后,你需要将 nums 中每一个......
  • 【算法一周目】数据深处的舞者:二分查找的优雅与力量
    文章目录1.二分查找2.在排序数组中查找元素的第一个和最后一个位置3.搜索插入位置4.x的平方根5.山峰数组的峰顶6.寻找峰值7.搜索旋转排序数组中的最小值8.0~n-1中缺失的数字1.二分查找题目链接:704.二分查找题目描述:给定一个升序排列的整数数组nums,和一个目标值......
  • 力扣 3266. K 次乘运算后的最终数组 II
    发现\(k\le10^9\),肯定不能直接模拟了。但是注意到,如果最小值\(\min\timesm>\max\)存在,我们可以直接给每个数乘上\(m^{\lfloor\frac{k}{n}\rfloor}\),最后再处理剩下的\(k\bmodn\)个\(m\)即可,这个复杂度是\(O(n)\)的。具体地说,最小值乘上一个\(m\)超过最大值之后,其......
  • 新手学习C语言打卡8(数组)
    数组:数组:是一种容器,可以用来存储同种类数据类型的多个值数组的本质是地址数组的定义:数据类型数组名[长度]eg:intarr=[3];                   特点1.连续的空间特点2.一旦定义,长度不可变数组的初始化:数据类型数组名[长度]={数据值,数据值...}......