这是我参与更文挑战的第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]
}
}
}
执行下代码,没有问题,那么还有其他办法吗?
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)
}
};
最后
从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100
。