1. 程式人生 > >Leet Code OJ 1. Two Sum [Difficulty: Easy]

Leet Code OJ 1. Two Sum [Difficulty: Easy]

1.兩數之和

出現頻度為5

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個

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

Python代實現:

方法一:暴力法

最簡單的思路,就是用兩個for迴圈分別遍歷陣列中的數,找到兩個數的和為target。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        l = len(nums)
        for i in range(0,l):
            for j in range(0,l):
                if j != i:
                    if nums[i]+nums[j] == target:
                        return [i,j]

時間複雜度為O\left ( n^{2} \right ),兩個for迴圈巢狀,執行一次外部的for迴圈需要執行n次內部for迴圈,耗費O\left ( n \right )時間,故一共為n*n

空間複雜度O\left ( 1 \right )

 

方法二:

先把值和序號存在字典中,這個字典中,key為數值,value為對應的序號0,1,2...,然後遍歷字典,找target-nums[i]是否在字典中,注意兩個資料的序號值不相等。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dic = {}
        l = len(nums)
        for i in range(l):
            dic[nums[i]] = i
        for i in range(l):
            if target-nums[i] in dic and i < dic[target-nums[i]]:
                return [i,dic[target-nums[i]]]

時間複雜度O\left ( n \right ),我們把包含有 n個元素的列表遍歷兩次,所以時間複雜度為O\left ( n \right )

空間複雜度O\left ( n \right ) ,所需的額外空間取決於字典中儲存的元素數量,最多儲存了 n 個元素。 

 

方法三:

在迭代中,將陣列中的某值的對應計算值放入字典的同時,一邊檢測這個值是否已經存在字典中,若不存在則把他相應的計算值存入字典,若存在則將他們返回。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dic = {}
        l = len(nums)
        for i in range(l):
            a = target-nums[i]
            if nums[i] in dic:
                return [dic[nums[i]],i]
            else:
                dic[a] = i

時間複雜度O\left ( n \right ),只遍歷了包含n個元素的列表一次。在表中進行的每次查詢只花費 O\left ( 1 \right )的時間。

空間複雜度O\left ( n \right ), 所需的額外空間取決於字典中儲存的元素數量,最多需要儲存 n 個元素。