1. 程式人生 > >簡單演算法題-兩個數相加

簡單演算法題-兩個數相加

簡單演算法題-兩個數相加

題目的大意大概是這個樣子的:
給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。

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

示例:

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

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



一開始的時候我想的就是這個題還不簡單 暴力麼.
外圈迴圈定住一個值 內圈迴圈暴力搜尋找到了就return
但是時間複雜度過高
先貼一下暴力的程式碼吧


    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] == target - nums[i]) { //target是目標值
                return new int[] { i, j };
            }
        }
    }
    return null;

時間複雜度為O(n^2) 空間複雜度O(1)



後來我發現有一個超級巧妙的辦法 就是用hash表
HashMap<Integer,Integer>();
我們可以讓Key 儲存 當前元素的值 value 儲存對應的陣列下標
每遍歷一個先看一下 target(目標值) - nums[i] 存不存在這個鍵
如果存在這個鍵 返回這個鍵所對應的value 和 i就可以
如果不存在 那麼我們就存到HashMap裡
這樣一遍遍歷就可以

	public int[] twoSum(int[] nums, int target) {
    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();
}

時間複雜度:O(n)

空間複雜度:O(n)