初試Leetcode

玩了一下leetcode,做最簡單的two sum問題(https://leetcode.com/problems/two-sum/ )。
首先上來用了簡單粗暴的for循環,還用了兩次。雖然正確算出結果,卻用了6400ms的時間(大部分答案的運算時間在幾十毫秒)。

# first try
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i]+nums[j] == target:
                    result = [i,j]
                    break
                    
        return result

後來嘗試用library,先把list整個轉化成library,再做一些算法運算。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        
        dictA = {k: v for v, k in enumerate(nums)}

        for i, el in enumerate(nums):
            dictA.pop(nums[i])
            
            if target-nums[i] in dictA.keys():
                result=[i,dictA[target-nums[i]]]
            else:
                print(dictA)
        return result

這種算法在input列表裏有重複元素是會出現Runtime Error,應該array是整體轉化成dict之後,有重複元素,在for loop裏pop或del後便會報錯。

後來朋友提醒我,何必一開始就全部轉化呢?如果前兩個元素就符合要求的話,全部轉化之後再計算會耗費更多的資源。
於是有了後來這個算法,運算時間32ms:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        
        dictA = {}
        
        for i in range(len(nums)):
            if target-nums[i] in dictA.keys():
                result=[dictA[target-nums[i]],i]
                return result
                break
            else:
                dictA.update({nums[i]:i})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章