1. 程式人生 > >LeetCode 演算法題之:TwoSum

LeetCode 演算法題之:TwoSum

題目

給定一個無重複的整數陣列和一個目標值,找出陣列中兩個和為目標值的元素的索引。

舉例

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

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

解法

最簡單的做法是使用雙重迴圈。

def twoSum(nums, target):
    for i in range(0, len(nums)):
        for j in range(i + 1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]

但是時間複雜度為 O(n^2),空間複雜度為 O(1),無法通過。

改用HashTable儲存列表資料,以空間換取時間

def twoSum(nums, target):
    dct = {}
    for i, x in enumerate(nums):
        dct[x] = i
    for i, x in enumerate(nums):
        j = dct[target - x] if target - x in dct else -1 #關鍵之處
        if j != -1 and j != i:
            return [i, j]

再進一步,在單次迴圈中處理

def twoSum(nums, target):
    dct = {}
    for i, x in enumerate(nums):
        j = target - x
        if j in dct:
            return [dct[j], i]
        else:
            dct[x] = i