【Java】【JS】LeetCode - 哈希表 - # 001 兩數之和

哈希表知識回顧

哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。

哈希衝突的解決方案:1.開放定製法  2.鏈地址法   3.公共溢出區法  4.再散列法


# 1 兩數之和

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。

題目鏈接:https://leetcode-cn.com/problems/two-sum/

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

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

方法一:暴力兩層遍歷

// java
class Solution {
    public int[] twoSum(int[] nums, int target) {
        for(int i = 0; i < nums.length; i++){
            for(int j = i+1; j < nums.length; j++){
                if(nums[i] + nums[j] == target){
                    return new int[] {i,j};
                }
            }
        }
        throw new IllegalArgumentException("no two sum solution");
    }
}

 

/**JavaScript
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    for(var i = 0; i < nums.length; i++){
        var com = target - nums[i];
        for(var j = i+1; j < nums.length; j++){
            if(nums[j] == com){
                return [i,j];
            }
        }
    }
};

方法二:兩遍哈希表

    爲了對運行時間複雜度進行優化,我們需要一種更有效的方法來檢查數組中是否存在目標元素。如果存在,我們需要找出它的索引。保持數組中的每個元素與其索引相互對應的最好方法是什麼?哈希表。哈希表支持以 近似 恆定的時間進行快速查找。

    一個簡單的實現使用了兩次迭代。在第一次迭代中,我們將每個元素的值和它的索引添加到表中。然後,在第二次迭代中,我們將檢查每個元素所對應的目標元素(target - nums[i]target−nums[i])是否存在於表中。注意,該目標元素不能是 nums[i]nums[i] 本身!

// java
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();   // hash表聲明
        for(int i = 0; i < nums.length; i++){
            map.put(nums[i], i);   // 一次遍歷將元素和其索引放入哈希表
        }
        for(int i = 0; i < nums.length; i++){    // 二次遍歷找結果
            int com = target - nums[i];
            if(map.containsKey(com)&&map.get(com)!=i){   
                return new int[] {i, map.get(com)};
            }
        }
        throw new IllegalArgumentException("no two sum result");
    }
}

方法三:一遍哈希表 

簡化二遍哈希表。在進行迭代並將元素插入到表中的同時,我們還會回過頭來檢查表中是否已經存在當前元素所對應的目標元素。如果它存在,那我們已經找到了對應解,並立即將其返回。

// java
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();   // 哈希表聲明
        for(int i = 0; i < nums.length; i++){
           int com = targrt - nums[i];
           if(maps.containsKey(com)){   // 哈希表裏可以找到差值,直接返回
                return new int[] {map.get(com),i};   // 注意順序
           }
           map.put(nums[i],i);  // 哈希表沒有就將元素放入哈希表
        }
        
        throw new IllegalArgumentException("no two sum result");
    }
}
/*Javascript*/
var twoSum = function(nums, target) {
    const map = new Map();
    for(let i = 0; i < nums.length; i++){
        const com = target - nums[i];
        if(map.has(com)){
            return [map.get(com),i];
        }else{
            map.set(nums[i],i);
        }
    }
};

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