首頁  >  問答  >  主體

javascript - 下面的這段演算法程式碼求解釋

#就是關於這個演算法的程式碼,用javascript實現的,但下面這個演算法沒看懂。求大神解釋。

var twoSum = function(nums, target) {
    var ret = [];
    var exist = {};
    for(var i = 0; i < nums.length; i++){
        if(typeof(exist[target - nums[i]]) !== 'undefined'){
            ret.push(exist[target - nums[i]]);
            ret.push(i + 1);
        }
        
        exist[nums[i]] = i + 1;
    }
    
    return ret
};
習慣沉默習慣沉默2662 天前876

全部回覆(1)我來回復

  • 淡淡烟草味

    淡淡烟草味2017-07-05 10:43:45

    題主可以試著用例子代入進去走讀一遍程式碼。以下是我的見解:

    例如就按截圖裡的例子:

    for循環裡主要是遍歷第一個參數數組,然後它做的關鍵兩個步驟:

    我們先看if後面那個, exist[nums[i]] = i + 1; 這句是每個循環都會執行的,exist在這裡是字典的意思,例如遍歷第一個數是2(i =0),於是exist就保存了:{2:1} 這樣的鍵值對,所以一遍循環下來,exist將會是:
    數組反過來,「元素值」:"數組索引+1"的鍵值對字典。

    接下來,再去看if裡面的判斷,當然for循環i=0時,exist還沒有註入鍵值對,if表達式為false

    但到了i=1的時候exist[target-nums[1]] 即exist[9-7] = exist[2], 這不就是剛才i=0的時候,就注入exist的第一個鍵值對麼?於是乎,把對應的鍵值對的值(其實就是原數值的在原來數組的索引+1)存檔ret去,接著又把當前的i+1 也存到ret…最後循環走完,返回ret ,於是得到了[1,2] ps:題主給的例子答案跟代碼的不一致。

    總結:這個演算法核心就是利用的物件exist來存已遍歷過的陣列元素,利用target-nums[i] 反過來間接透過exist來找出陣列已遍歷過的元素是否存在符合條件的元素。

    回覆
    0
  • 取消回覆