持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
一直打算好好把算法系统的学习下,但都是学习一段时间就无疾而终了,下面这道题就是我之前学习在力扣做的第一道题目。如今又重新开始学习算法,希望这次能够坚持下去,加油吧!
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
解题思路:
-
暴力枚举
第一层循环,遍历出数组中每一个数,第二层循环的目的是找到和 nums[i] 匹配的数字,由于数组不是有序的,不得不一个个遍历。如果两个数字的和是target,就返回各自在数组的下标
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ var twoSum = function(nums, target) { const len = nums.length; for (let i = 0; i < len - 1; i++) {//第一层循环 //当寻找第二个值的时候,不是从头开始找,而是从外层循环 i 之后找 for (let j = i + 1; j < len; j++) { if (nums[i] + nums[j] === target) { return [i, j] } } } }; -
哈希表的应用
采用哈希表优化第二次循环(空间换时间),让查找的过程变为
O(1)。首先还是遍历nums数组,然后让target减去当前元素,得到相匹配的元素(other),在哈希表中寻找other,如果存在就返回other和当前元素的下标,不存在就把当前元素和下标存入哈希表,var twoSum = function(nums, target) { const len = nums.length; const map = new Map(); for(let i = 0; i < len; i++){ let other = target - nums[i]; if(map.has(other)) return [map.get(other), i] map.set(nums[i], i) } };
扩展:Map
new Map() 构造函数创建 Map对象。类似于object,也是键值对的集合,但是键的范围不限于字符串,包括函数、对象或任意基本类型都可以当作键
let myMap = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
])
Map属性和方法
-
size属性:返回
Map对象中的键值对数量(成员数量)。 -
set(key, value): 设置键(key)所对应的值(value),并返回
Map对象。 -
get(key):返回与 key 对应的值,若找不到key,则返回 undefined。
-
has(key):返回一个布尔值,表示key 是否存在
Map对象中。 -
delete(key):移除
Map对象中指定的键值对,成功被移除,返回 true,否则返回 false。 -
clear():移除
Map对象中所有的键值对,没有返回值。
var map = new Map(); // 空Map
map.set('age', 67); // 添加新的key-value
map.set(0, 'zore');
map.has('age'); // true
map.get('age'); // 67
map.delete(0); // true
map.size // 1