1. 程式人生 > >001 Two Sum

001 Two Sum

數量 題目 它的 ++ ber ret contain ces get

題目:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

題意:

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

你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。

Solution:

方法一:暴力法

Java:

 1 public int[] twoSum(int[] nums, int target) {
 2     for (int i = 0; i < nums.length; i++) {
 3         for (int j = i + 1; j < nums.length; j++) {
4 if (nums[j] == target - nums[i]) { 5 return new int[] { i, j }; 6 } 7 } 8 } 9 throw new IllegalArgumentException("No two sum solution"); 10 }

復雜度分析:

    •  時間復雜度:O(n^2), 對於每個元素,我們試圖通過遍歷數組的其余部分來尋找它所對應的目標元素,這將耗費 O(n)的時間,因此時間復雜度為 O(n^2)

    •  空間復雜度:O(1)

方法二:一遍哈希表

為了對運行時間復雜度進行優化,我們需要一種更有效的方法來檢查數組中是否存在目標元素。如果存在,我們需要找出它的索引。

保持數組中的每個元素與其索引相互對應的最好方法是什麽?哈希表。

通過以空間換取時間的方式,我們可以將查找時間從 O(n)降低到 O(1)。哈希表正是為此目的而構建的,它支持以 近似 恒定的時間進行快速查找。

我用“近似”來描述,是因為一旦出現沖突,查找用時可能會退化到 O(n)。但只要你仔細地挑選哈希函數,在哈希表中進行查找的用時應當被攤銷為 O(1)

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

C++:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> mp;
        int i = 0;
        for (; i < nums.size(); ++i) {
            if (mp[target - nums[i]] != 0) {
                //found
                vector<int> r = {mp[target - nums[i]] - 1, i};  //由於mp[nums[i]]先前加了1,所以要減去1
                return r;
            } else {  //if(mp[target - nums[i]] == 0),說明哈希表不存在這個值,就要把這個值存入哈希表中。
                mp[nums[i]] = i + 1; //由於i = 0,避免mp[nums[i]]也等於0
            }
        }
        vector<int> r;
        return r;
    }
};

Java:

 1 public int[] twoSum(int[] nums, int target) {
 2     Map<Integer, Integer> map = new HashMap<>();
 3     for (int i = 0; i < nums.length; i++) {
 4         int complement = target - nums[i];
 5         if (map.containsKey(complement)) {
 6             return new int[] { map.get(complement), i };
 7         }
 8         map.put(nums[i], i);
 9     }
10     throw new IllegalArgumentException("No two sum solution");
11 }

復雜度分析:

  • 時間復雜度:O(n), 我們只遍歷了包含有 n個元素的列表一次。在表中進行的每次查找只花費 O(1)的時間。

  • 空間復雜度:O(n), 所需的額外空間取決於哈希表中存儲的元素數量,該表最多需要存儲 n個元素。

001 Two Sum