Leet Code OJ 1. Two Sum [Difficulty: Easy]
阿新 • • 發佈:2018-12-13
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]
時間複雜度為,兩個for迴圈巢狀,執行一次外部的for迴圈需要執行n次內部for迴圈,耗費時間,故一共為n*n
空間複雜度
方法二:
先把值和序號存在字典中,這個字典中,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]]]
時間複雜度,我們把包含有 n個元素的列表遍歷兩次,所以時間複雜度為。
空間複雜度 ,所需的額外空間取決於字典中儲存的元素數量,最多儲存了 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
時間複雜度,只遍歷了包含n個元素的列表一次。在表中進行的每次查詢只花費 的時間。
空間複雜度, 所需的額外空間取決於字典中儲存的元素數量,最多需要儲存 n 個元素。