LeetCode - 1. Two Sum(兩數之和)

1. 問題描述

 

2. 解題思路

    該問題作爲第一題,還是比較簡單的,對數組遍歷兩遍就可以了。

    但由於平時寫代碼從來沒注意過優化,寫的代碼實行效率較低,因此實現該問題時遇到了一些小麻煩。解決之後也學習到了一些新東西,即寫代碼的一些良好習慣。

 

3. 代碼

3.1 第一次提交

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            for j in range(len(nums)-i-1):
                if nums[i] + nums[i+1+j] == target:
                    return [i,i+1+j]

    用python實現的代碼(博士之後做科研都是用的python,很久沒有用c++了),功能是實現了,但提交時失敗了,原因是Time Limit Exceeded (超時了)。考慮很久,也沒發現什麼問題。(原諒我太久沒有看編程之類的書了。早忘掉了Map,Hash之類的提速的數據類型了。)

 

3.2 第二次提交

     看了會別人的Discussion和官方給出的Solutions,我發現我的代碼和官方給出的最傻的solution是一樣的(官方是java實現的,和我的算法思路是一樣的),最初我以爲是因爲我用的python比java慢,因此失敗了。但後來一想,不應該因爲python慢就不讓我通過啊,可能是其它原因?

     又仔細看了我的代碼,比較了官方的代碼,發現官方的代碼中,第二個循環j是從i+1開始的,到len(nums)結束,而我的是從0到len(nums)-i-1,雖然遍歷的個數是一樣的,但我的程序每次循環時需要多進行三步加法運算,可能是這部分影響了程序的總時間。

     但我平時用python時for循環都是用的range,而平時用range也就只有一個參數,都是從0開始的。查了文檔之後,發現range可以接受多個參數,可以設置開始和結束的數。因此我改進了算法,再次提交得以通過。

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i] + nums[j] == target:
                    return [i,j]

 

4. 總結

通過該題:

(1)學會了range的用法;

(2)以後注意優化代碼,儘量避免那些不是必須的運算,以節省時間。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章