Leetcode題庫第一題(簡單系列)
阿新 • • 發佈:2019-01-08
第一題:
給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。
示例:
給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
以下是用Python3作為解題,但是summit之後,到最後一步出現的了timeout的情況,這種情況說明此方法屬於暴力解法,還不夠優化
class Solution: def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ self.nums=nums self.target=target s=[] for i in range(len(nums)): for j in range(len(nums)): if i<j: sum=nums[i]+nums[j] if sum == target: s.append(i) s.append(j) return s
我又嘗試了另一種迴圈方法,但是還是出現了timeout的結果
class Solution: def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ self.nums=nums self.target=target lent=len(nums) s=[] for i in range(lent): for j in range(i+1,lent): sum=nums[i]+nums[j] if sum==target: s.append(i) s.append(j) return s
在網上搜了一下其他人的方法,發現有一個方法使用的是用dictionary來做的,我看了一下編碼的過程,發現使用的是while迴圈來做的,而且解題的思路是用target為已知的,然後去相減來求出結果,我把他人的方法複製在下面,
通過以上的方法,我也嘗試了用while迴圈而解題,但是我去掉了dict,因為我覺得這個位置可以不需要,但是我提交之後出現了錯誤,說明這個方法也是錯的,這個位置主要因為在while裡面有多重的if判斷,導致return和size=size+1這2點,在實施和執行的時候出現了問題
class Solution: def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ size = 0 while size<len(nums): a=target-nums[size] if a not in nums[size+1:]: continue else: b=nums.index(a) if a==nums[size]: b=nums[size+1:].index(a)+size else: b=nums.index(a) fina=[size,b] size=size+1 return fina
後來,我將while迴圈除掉了,還是改成了我的for遍歷的結構來程式設計構思,最後,congratulation,我通過了。
在看到的別人的解題方法的時候,我學習到了,這道題不能固有的遍歷相加而做,還可以使用相減的方法,減少遍歷的過程,並且當存在相同的數字的時候,要區分判斷,以下是我最終通過第一題的方法。
class Solution: def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ for i in range(len(nums)): a=target-nums[i] if a in nums[i+1:]: if a==nums[i]: b=nums[i+1:].index(a)+i+1 fina = [i, b] return fina else: b=nums.index(a) fina=[i,b] return fina
最後截圖一下