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)以後注意優化代碼,儘量避免那些不是必須的運算,以節省時間。