两数之和为n的下标组合(去重)

两数之和为n的下标组合(去重)

题目

	给你一个数组nums和一个target,找到nums中两个数之和为target的下标组合。
示例1

输入:nums = [2, 3, 7, 11, 13, 15, 16], target = 18
输出:[ [ 0, 6 ], [ 1, 5 ], [ 2, 3 ] ]

示例2

输入:nums = [2, 2, 7, 11, 13, 15, 16], target = 15
输出:[ [ 0, 4 ], [ 1, 4 ] ]

示例3

输入:nums = [3,3], target = 6
输出:[0,1]

解题思路

一、暴力枚举

暴力枚举的核心思想就是通过层层遍历来求得符合条件的解。在这个问题中,我们可以通过内外两次遍历给定的数组,从而将每次遍历到的两个数进行相加与target进行匹配,如果相等,则记录下两数的下标以数组形式放至一个新数组里,形成一个二维数组,然后返回。
这个遍历的过程中我们可以做两点优化:

1.外层遍历时,算出target与当前值的差值,然后在nums数组中寻找第一个等于差值的下标。
2.第一步找到满足条件的下标后,同时去查找满足条件的二维数组中是否已经存在该下标组合,如果之前不存在则添加进去,否则不添加。

javascript代码如下

// 两数之和为n的下标组合(去重)
const nums = [2, 3, 7, 11, 13, 15, 16]
const target = 18
// 符合条件下标组合的数组
let needList = []
const numTwo = (nums, target) => {
    nums.forEach((item, index) => {
        // target与当前数之差
        const need = Number(target - item)
        // 是否存在于nums中
        const findNeed = nums.findIndex((i) => i === need)
        // needList是否已经存在当前下标组合,如果存在则不添加进去
        const equal = needList.find(i => {
            if (i[0] === findNeed && i[1] === index) {
                return i
            }
        })
        if (findNeed > -1 && !equal) {
            needList.push([index, findNeed])
        }
    })
    return needList
}
numTwo(nums, target)

总结

  • 暴力枚举方法通过层层遍历求解,该方法的时间复杂度为 O( n ∧ 2 ) ,空间复杂度为 O ( n ) 。
  • 优化后采用寻找的方式代替遍历,运行速度有所提升,其实用map寻找的方式会更快一点。时间复杂度为O( n ) ,空间复杂度为 O ( n )。

暴力枚举如果在不考虑空间复杂度和时间复杂度的情况下是很常规的一种解题思路,比较万能,但是如果考虑到更快的运行速度的话可能就不满足条件了,需要对之进行优化。在理解这些算法的同时,学会灵活应用将是解决问题的关键。

算法题对于前端开发来说貌似不相关,平时工作中也不太能用得上,但是培养出解决办法的思维能力是一通百通的,当生活中碰到类似的事情,也能开动脑筋应对之。这不仅仅是对个人的技术储备提升大有裨益,对工作中面试也是一个加分项。
今天的算法题就分享到这了,下期见 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值