00 写在前面
更多相关内容关注:www.yuque.com/zhengao/jav…
My Blog: www.yuque.com/zhengao
微信公众号: mcity_xiaoza(有福利)
01 LeetCode 信息
Tags
array | HashTable
Companies
adobe | airbnb | amazon | apple | bloomberg | dropbox | facebook | linkedin | microsoft |uber | yahoo | yelp
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素(每个元素只使用一次)。
示例:
// 给定
nums = [2, 7, 11, 15], target = 9
// 因为
nums[0] + nums[1] = 2 + 7 = 9
// 所以返回
[0, 1]复制代码
02 解题思路
1. 暴力破解
看到这个题的第一反应就是使用两次 For 循环, 依次取出两个数字,计算相加的和是否为我们需要的目标值,如果连个数字可以满足就返回它们的下标。
可能我们第一次看到这个题目的时候都是在优先考虑暴力破解的。但是暴力破解使用的两次 For 循环使得时间复杂度为On2
2. Hash(JS - Map)
使用JavaScript 在ES6中添加的 Map 类型可以达到模拟Java中的HashMap的作用。在这里如果使用普通的对象的话,不会有Map的原生特性:
(1)原生支持的元素的唯一性原则。
(2)原生的判断方法: 是否包含某个元素。
解题的思路大致分为几个阶段:
(1)建立一个唯一元素的Hash表( js Map)。这个Map 会为我们储存循环已经经过的元素及其下标。
(2)建立一个临时变量,临时变量存储着目标数值与循环当前值得差值。
(3)在Map中寻找是否包含和临时变量(差值)相同的元素。
(4)如果有就得到了我们需要的两个元素,如果没有就把当前元素插入到Map中。
(5)继续循环到得到需要的两个元素为止。
解题思路记忆:
在取代暴力破解方法的时候,我们经常会使用到一个单独的数据结构来缓存一些对我们后续有帮助的内容。这样可以很好节省两次循环达到比较两个数值的目的。
03 Coding
JavaScript
function Soluction (arr, target) {
const map = new Map();
for(let i = 0; i < arr.length; i ++) {
const item = arr[i];
const temp = target - item;
if(map.has(temp)) {
return [map.get(temp), i]
} else {
map.set(item, i);
}
}
}
Soluction([2, 7, 11, 15], 13); // [0, 2]复制代码
03 运行结果输出
Input data:
[2,7,11,15]
9
Actual
✔ runtime: 108 ms
✔ answer: [0,1]
✔ stdout: ''
Expected
✔ runtime: 44 ms
✔ answer: [0,1]
✔ stdout: ''复制代码
04 参考
- # JavaScript ES6 Map