leetcode top100挑战, 每天不鸽一道题之 两数之和

872 阅读2分钟

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

题目描述

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

leetcode-cn.com/problems/tw…

// 示例1 
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
// 示例2 
输入:nums = [3,2,4], target = 6
输出:[1,2]
// 示例3
输入:nums = [3,3], target = 6
输出:[0,1]

提示: 只会存在一个有效答案

标签

暴力枚举 HashMap

解题分析

1. 暴力枚举

首先确定返回值,当target = 9 时,在nums数组中会有两个元素相加等于9。第一个想法是两层遍历直接确定两个相加等于9的元素。

function twoSum(nums: number[], target: number): number[] {
    for(let i=0; i<nums.length; i++) {
        for(let j=0; j<nums.length; j++) {
            const iNum: number = nums[i]
            const jNum: number = nums[j]

            if(iNum + jNum === target) return [i, j]
        }
    }
}

执行下代码,没有问题,那么还有其他办法吗?

image.png

2. HashMap

我们都知道在es6中新增的类型Map,我们可以使用它来实现哈希表来降低时间复杂度。

首先我们创建一个Map, 在传入数组遍历中,创建一个变量diff来存放遍历元素target 的差值

nums = [2,7,11,15], target = 9 
//遍历中 

num = nums[i]  => 2 / 7 / 11 / 15 
target = 9

diff = target - num   => 9 -  2 / 7 / 11 / 15  => 7 / 2 / -2 / -6

然后我们将diff存入Map中,以diff为下标,以遍历中的index为值,因为要返回两个元素的下标,所以要记录index。

最后在遍历中,都先判断每个遍历元素是否存在于HashMap中,如果存在那就说明当前遍历元素和HashMap中以diff为下标的元素相加等于target

这两个元素就是我们需要返回的答案,直接上代码。

function twoSum(nums: number[], target: number): number[] {

    const map: Map<number, number> = new Map()

    for(let i =0; i< nums.length; i++) {
        const num = nums[i]
        const diff: number = target  - num

        if(map.has(diff)) return [map.get(diff), i]
        map.set(num, i)
    }
};

image.png

最后

从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100