更多相關內容關注: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: ''複製代碼