LeetCode之兩數之和

爍華發表於2020-10-13

題目:給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
  你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
示例:
在這裡插入圖片描述
解析:本題有倆種解法,一種是簡單粗暴的暴力破解,另外一種是巧妙地運用到了JavaSE提供的API裡面的雜湊表來提高執行效率。

方法一:暴力破解法

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

複雜度分析

  時間複雜度:O(N^2),其中 N 是陣列中的元素數量。最壞情況下陣列中任意兩個數都要被匹配一次。

  空間複雜度:O(1)

雜湊表法:

解題思路:
  注意到方法一的時間複雜度較高的原因是尋找 target - x 的時間複雜度過高。因此,我們需要一種更優秀的方法,能夠快速尋找陣列中是否存在目標元素。如果存在,我們需要找出它的索引。
  使用雜湊表,可以將尋找 target - x 的時間複雜度降低到從 O(N) 降低到 O(1)。
  這樣我們建立一個雜湊表,對於每一個 x,我們首先查詢雜湊表中是否存在 target - x,然後將 x 插入到雜湊表中,即可保證不會讓 x 和自己匹配。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; ++i) {
            if (hashtable.containsKey(target - nums[i])) {
                return new int[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i], i);
        }
        return new int[0];
    }
}

複雜度分析
  時間複雜度:O(N),其中 NN 是陣列中的元素數量。對於每一個元素 x,我們可以 O(1)地尋找 target - x。
  空間複雜度:O(N),其中 NN 是陣列中的元素數量。主要為雜湊表的開銷。

相關文章