创新编码

不说话,装高手。

Maintain silence and pretend to be an experta

CodeTop100-简单-两数之和

2024-08-28 23:02:42算法

方法一

暴力枚举,通过遍历 nums 数组中每一个元素 a,查找出 b = target - a,需要注意 a 之前的元素都已经和 a 匹配过,所以需要取 a 后面的元素来寻找 b

折叠代码 复制代码
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    for(let i = 0; i < nums.length; i++) {
        for(let j = i + 1; j < nums.length; j++) {
            if(nums[i] + nums[j] === target) {
                return [i, j]
            }
        }
    }
};

哈希表

得到当前值 a,计算出目标差值 b,检查哈希表是否存在目标差值,存在直接返回,不存在则将当前数字做为 key,当前下标做为 value 存进去

折叠代码 复制代码
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    const map = new Map()
    for(let i = 0; i < nums.length; i++) {
        const a = nums[i]
        const b = target - a
        if(map.has(b)) {
            return [map.get(b), i]
        }
        map.set(a, i)
    }
};

双指针法

双指针处理,分别取头部和尾部下标做为 leftright,在使用 sort 方法对数组从小到大进行排序,while循环处理,当 left 小于 right 时,通过指针计算两数之和 res,若 res 等于最终 target,则返回下标,通过 indexOf 方法获取原数组中的下标,如若 res !== target,则判断 res 是否小于 target,是 left 继续往前取,否 right 往后取

注意:为什么需要用 lastIndexOf 取下标?是为了当 nums === [3,3] 时,直接 indexOf 会取到两个下标都是 0

折叠代码 复制代码
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let left = 0
    let right = nums.length - 1

    const sort = [...nums].sort((a, b) => a - b)

    while(left < right) {
        const res = sort[left] + sort[right]
        if(res === target) {
            return [nums.indexOf(sort[left]), nums.lastIndexOf(sort[right])]
        } else if (res < target) {
            left ++
        } else {
            right --
        }
    }
};