第一題:
給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。
示例:
給定 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爲已知的,然後去相減來求出結果,我把他人的方法複製在下面,LeetCode 第一題
通過以上的方法,我也嘗試了用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
最後截圖一下