1. 程式人生 > >Leetcode題庫第一題(簡單系列)

Leetcode題庫第一題(簡單系列)

第一題:

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

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

示例:

給定 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

最後截圖一下大笑大笑大笑