前言
博客裏新開一個「用python手刃Leetcode」的專題,顧名思義,主要目的是記錄本身在Leetcode上刷題的過程,代碼全程用python3編寫,所用網址是:leetcode中國。這個網址的好處是:1)純中文,解決了英語很差讀題困難的問題;2)網頁打開速度快。 ` 同時能夠看到:目前官網給出的解題代碼是用java編寫的,並無給出官方的python解答,本專欄除了儘可能使用多種解法給出每道題的python3解答代碼以外,還會記錄下本身在作題過程當中的一些收穫和思考。便於之後複習查閱。java
給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
你能夠假設每一個輸入只對應一種答案,且一樣的元素不能被重複利用。python
示例:數組
給定 nums = [2, 7, 11, 15], target = 9app
由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]函數
首先無論三七二十一,利用暴力解法來嘗試。優化
class Solution:
def twoSum(self, nums, target):
""" :type nums: List[int] :type target: int :rtype: List[int] """
renum = []
n = len(nums)
for i in range(n):
for j in range(i+1,n):
if nums[i]+nums[j] == target:
renum.append(i)
renum.append(j)
break
return(renum)
複製代碼
【備註】:對於一個函數來講,程序在執行return()後會自動中止,即在函數中,return有break的功能。因此,以上代碼能夠作一個小優化:在break處直接寫return()函數。就像這樣:spa
……
if nums[i]+nums[j] == target:
renum.append(i)
renum.append(j)
return(renum) #此處直接用return代替break
複製代碼
可是,這種暴力解法因爲時間複雜度過高,通常是沒有辦法來經過leetcode的,會報錯以下: .net
class Solution:
def twoSum(self, nums, target):
""" :type nums: List[int] :type target: int :rtype: List[int] """
dic = {}
for i, num in enumerate(nums):
if num in dic:
return [dic[num], i]
else:
dic[target - num] = i
複製代碼
這個解法的思路是:首先把原來的List建成一個字典,而後新建另外一個空字典,每次在字典中存儲時,dic的key:target - num,value:原List組成的字典值對應的索引。若是檢測到某個nums中的值已經存在於新建的字典中,那麼證實能夠組成一個target值,這時返回此刻遍歷到的索引與dict中記錄下來的索引。code
class Solution:
def twoSum(self, nums, target):
for i in range(len(nums)):
if target-nums[i] in nums[i+1:]:
return [i,nums.index(target-nums[i],i+1)]
複製代碼
enumerate()函數能夠把一個List按照索引從小到大的順序組成一個字典。 python enumerate用法總結cdn