更多相关内容关注:www.yuque.com/zhengao/jav…javascript
My Blog: www.yuque.com/zhengaojava
微信公众号: mcity_xiaoza(有福利)es6
array | HashTable数组
adobe | airbnb | amazon | apple | bloomberg | dropbox | facebook | linkedin | microsoft |uber | yahoo | yelp缓存
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你能够假设每种输入只会对应一个答案。可是,你不能重复利用这个数组中一样的元素(每一个元素只使用一次)。
bash
示例:微信
// 给定
nums = [2, 7, 11, 15], target = 9
// 由于
nums[0] + nums[1] = 2 + 7 = 9
// 因此返回
[0, 1]复制代码
看到这个题的第一反应就是使用两次 For 循环, 依次取出两个数字,计算相加的和是否为咱们须要的目标值,若是连个数字能够知足就返回它们的下标。数据结构
可能咱们第一次看到这个题目的时候都是在优先考虑暴力破解的。可是暴力破解使用的两次 For 循环使得时间复杂度为On2app
使用JavaScript 在ES6中添加的 Map 类型能够达到模拟Java中的HashMap的做用。在这里若是使用普通的对象的话,不会有Map的原生特性:ui
(1)原生支持的元素的惟一性原则。
(2)原生的判断方法: 是否包含某个元素。
解题的思路大体分为几个阶段:
(1)创建一个惟一元素的Hash表( js Map)。这个Map 会为咱们储存循环已经通过的元素及其下标。
(2)创建一个临时变量,临时变量存储着目标数值与循环当前值得差值。
(3)在Map中寻找是否包含和临时变量(差值)相同的元素。
(4)若是有就获得了咱们须要的两个元素,若是没有就把当前元素插入到Map中。
(5)继续循环到获得须要的两个元素为止。
解题思路记忆:
在取代暴力破解方法的时候,咱们常常会使用到一个单独的数据结构来缓存一些对咱们后续有帮助的内容。这样能够很好节省两次循环达到比较两个数值的目的。
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]复制代码
Input data:
[2,7,11,15]
9
Actual
✔ runtime: 108 ms
✔ answer: [0,1]
✔ stdout: ''
Expected
✔ runtime: 44 ms
✔ answer: [0,1]
✔ stdout: ''复制代码