LeetCod[1].兩數之和(hash查找優化)

要求

給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。

你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

代碼

var twoSum = function(nums,target){
    var temp;
    var temp_index;
    for(var i = 0;i < nums.length;i++){
        temp = target - nums[i];
        temp_index = nums.lastIndexOf(temp);
        if(temp_index !== -1 && temp_index !== i){
             return [i,temp_index];
        }
  

leetcode耗時188ms,發現其運行很慢,即使用Array.prototype.lastIndexOf()來尋找元素索引效率比較低下.

優化

改用哈希表來搜索元素,因爲其查找元素的時間複雜度爲0(1).因JavaScript沒有內置哈希表,因此用對象來代替,因爲不用進行hash化,因此效率應該比哈希表的高.

var twoSum = function(nums,target) {
    let hash = new Object()
    for(let i = 0;i < nums.length;i++) {
        let temp = target - nums[i]
        if(hash.hasOwnProperty(temp)) {
            return [hash[temp], i]
        }
        // 遍歷的同時構建哈希表,不用事先遍歷數組構建哈希表
        // 因爲要用hash來搜索數組元素,因此數組元素作爲鍵值,索引其對應值
        hash[nums[i]] = i
    }
}

leetcode耗時64ms,測試結果爲上一方法的三倍速度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章