1. 程式人生 > >LeetCode演算法之TwoSum(雜湊表 簡單)

LeetCode演算法之TwoSum(雜湊表 簡單)

首先先給出問題描述,

給定一個整數陣列,返回兩個數字的索引,使它們相加到特定目標。

您可以假設每個輸入只有一個解決方案,並且您可能不會兩次使用相同的元素。

例:

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

因為nums [ 0 ] + nums [ 1 ] = 2 + 7 = 9,
返回[ 0,1 ]。

首先在不考慮時間和空間的情況下,暴力方法幾乎可以解決所有演算法問題,但是當今社會無論何種情況,哪怕再小的公司也沒有人願意聘用用暴力演算法解決問題的程式設計師,所以我的所有演算法介紹都沒有暴力演算法的介紹。

自己的解決方案:在拿到問題時,考慮到只用到數組裡面2個數字的和來解決問題,第一個想到資料結構雜湊表,也就是map來解決。具體實現方法如下:

public int[] twoSum(int[] nums, int target) {
        if(nums==null||nums.length==0){
            throw new IllegalArgumentException("給定陣列為空");
        }
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
            return new int[] { i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

再仔細思考後發現這種方法需要遍歷2次陣列,能不能在第一次遍歷的時候就判斷結果呢,答案是可以的。實現如下:

public int[] twoSum(int[] nums, int target) {
    if(nums==null||nums.length==0){
           throw new IllegalArgumentException("給定陣列為空");
    }
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] { map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

這道題是比較簡單了,沒有過多介紹想法,程式碼看兩眼都會懂的you