該博客記錄自己刷LeetCode的過程遥倦,每道題AC后總結(jié)寫博客,希望對自己又幫助碉考。
目前刷題使用語言為Python塌计。LeetCode鏈接。
問題描述如下侯谁。
首先我們分析題目锌仅。
題目的意思是給任意一個數(shù)組,在給一個目標(biāo)數(shù)墙贱。在數(shù)組中找到兩個數(shù)相加等于這個目標(biāo)數(shù)热芹,然后返回這兩個數(shù)的下標(biāo)。題目假設(shè)數(shù)組中只有唯一的兩個數(shù)相加等于目標(biāo)數(shù)惨撇,既返回的下標(biāo)只有一組伊脓。
這道題屬于很簡單的題目,代碼如下:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
others = target - nums[i]
if others in nums:
index1 = i
index2 = nums.index(others)
if index1 == index2:
continue
else:
break
return index1,index2
根據(jù)代碼可以很明確的看到思路魁衙。我們遍歷整個List报腔。用 target 減去第 i 個數(shù),得到others剖淀。然后在數(shù)組中找是否存在與others相等的數(shù)纯蛾。如果存在,則返回 i 和 others的下標(biāo)纵隔,如果不存在翻诉,則i + 1。
思路很簡單捌刮,但是要避免一個小坑碰煌。
如果List是[3 , 3], target = 6。按照上述思路糊啡,nums[0] = 3 , others = 3, 然后在數(shù)組中找到與others相等的數(shù)后即退出循環(huán)拄查,返回下標(biāo)吁津。我們返回的下標(biāo)是[0, 0] 而實際正確的答案應(yīng)該是[0, 1]棚蓄。
出現(xiàn)這個原因是因為堕扶,我們在數(shù)組中找是否存在與others相等的數(shù)時,也包括了nums[i]梭依,如果others 和 nums[i] 相等的情況稍算,則會返回相同的下標(biāo)。
解決這個小坑的方法有很多役拴。
我的思路是返回的判斷返回的下標(biāo),如果index1 = index2糊探,那么這次循環(huán)不算,continue河闰。然后進入下一次循環(huán)科平。
這樣[3 , 3], target = 6 返回的下標(biāo)是返回的下標(biāo)是[1, 0]。
這個地方我感覺有點問題姜性,應(yīng)該是[0, 1]因為continue后i + 1了瞪慧,所以會出這個問題。但是同樣AC了部念。
解決這個小問題的思路很簡單弃酌,這種情況只出現(xiàn)在others == nums[i]的情況,當(dāng)我們判斷這種情況出現(xiàn)時儡炼,我們把nums[i]的值置為無窮小妓湘,這樣不會影響結(jié)果。
修改后的代碼如下:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
others = target - nums[i]
if others == nums[i]:
nums[i] = -9999999
if others in nums:
index1 = i
index2 = nums.index(others)
if index1 == index2:
continue
else:
break
return index1,index2
很簡單的AC了乌询,用時有點暴力榜贴。
以上就是本題的解題代碼和思路。很簡單的題目妹田,如果對這種方法不滿意竣灌,也歡迎和我討論新的方法。
補充:
去做LeetCode的題目是為了提高自己的算法水平和代碼能力秆麸,基礎(chǔ)薄弱初嘹。有的題目雖然自己的方法可以AC,但是有更好的方法可以學(xué)習(xí)沮趣。個人認為刷題不僅是為了AC屯烦,更多的是學(xué)習(xí)新的方法和技巧。
關(guān)于本題參考了其他博客房铭,用Python Dict的方法用時更短也更巧妙驻龟。參考博客鏈接:http://www.cnblogs.com/zuoyuan/p/3698966.html
附上新的方法的代碼:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dictTmp = {}
for i in range(len(nums)):
x = nums[i]
if target - x in dictTmp:
return (dictTmp[target-x], i)
dictTmp[x] = i
新的方法采用的是Python字典的方法。
我們首先把nums[i]的值對應(yīng)的下標(biāo)放在字典里缸匪。在遍歷整個nums[i]時翁狐,判斷target -
nums[i]是否在字典中,如果在字典中凌蔬,則返回字典的下標(biāo)露懒,以及此時的i闯冷。
這種方法很巧妙,需要注意判斷的位置懈词。
由于表述問題可能不是很清楚蛇耀,建議有疑惑的同學(xué)自己用筆親自畫一畫或者Debug單步調(diào)試。
以上坎弯,祝好纺涤!