前言
准备根据修言老师的小册子结合leetcode上剑指offer的数组题学习这一部分。
Map的妙用
真题描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
emmm首先这道题我做过,虽然第一反应肯定是两层循环。但是仔细一想,可以用哈希表。
剑指offer原题 和这题太一样。给的是一个递增排序,所以考点就变成了二分或者双指针(下面会讲到)。
这里修言老师语:大家以后做算法题的时候,要有这样的一种本能:当发现自己的代码里有两层循环时,先反思一下,能不能用空间换时间,把它优化成一层循环。
大家记住一个结论:几乎所有的求和问题,都可以转化为求差问题。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
const twoSum = function(nums, target) {
// 这里我用对象来模拟 map 的能力
const diffs = {}
// 缓存数组长度
const len = nums.length
// 遍历数组
for(let i=0;i<len;i++) {
// 判断当前值对应的 target 差值是否存在(是否已遍历过)
if(diffs[target-nums[i]]!==undefined) {
// 若有对应差值,那么答案get!
return [diffs[target - nums[i]], i]
}
// 若没有对应差值,则记录当前值
diffs[nums[i]]=i