1. 程式人生 > 實用技巧 >Codeforces Round #688 (Div. 2) D Checkpoints

Codeforces Round #688 (Div. 2) D Checkpoints

LeetCode題目如下:

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

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

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

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

暴力求解

利用雙層迴圈,第一層迴圈遍歷nums陣列中的所有元素,第二層迴圈遍歷從第一層元素之後的元素開始遍歷到陣列末尾(其實就是將所有可能的情況全部列出來),因為思路非常簡單,這裡直接給出程式碼:

public 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};
            }
        }
        return new int[0];
    }
}

雜湊表求解

使用暴力求解的方法,其時間複雜度為O(n^2),使用雜湊表解題的思路就是避免使用第二層迴圈,從而使得時間複雜度為O(n)。

思路:

我們假設有這樣的資料存在:

nums = [ 7, 2, 3]
target = 10

將nums中的元素值作為key,nums的下標值作為value

遍歷陣列,使用target - nums[i]可以得出對應的那個數(我們預設 當前數 + 陣列中的其他數字 可以得出目標數)

如果雜湊表不包含該key,則將其新增進雜湊表,key為nums[i],value為i。     
//這裡i是下標,其實就是將nums[i]中的資料取出來作為雜湊表中的key,將i作為對應的value

如果雜湊表包含該key,則將其返回,其返回值就是雜湊表中nums[i]對應的value以及當前遍歷到的陣列下標

模擬執行過程(學會在紙上演示執行過程對自己的程式設計思想提升很有幫助且剛好理解):

當i = 0時
target - nums[0] 相當於 10 - 7 = 3 雜湊表中不包含key為3的鍵值對 故儲存資料:雜湊表.新增(nums[i], i)

當i = 1時
target - nums[1] 相當於 10 - 2 = 8 雜湊表中不包含key為8的鍵值對 故儲存資料:雜湊表.新增(nums[i], i)

當i = 2時
target - nums[2] 相當於 10 - 3 = 7 雜湊表中包含key為7的鍵值對,故返回資料:{nums[i],i}

實現如下:

public class Solution
{
    public int[] TwoSum(int[] nums, int target)
    {
        Hashtable hashtable = new Hashtable();
        int[] result = new int[2];
        for(int i = 0;i < nums.Length;i++)
        {
            if (hashtable.ContainsKey(target - nums[i]))
                return new int[] { (int)(hashtable[target - nums[i]]), i};
            hashtable.Add(nums[i],i);
        }
        return new int[0];
    }
}