算法很重要,但是每天也需要學(xué)學(xué)python,于是就想用python刷leetcode 的算法題,從第一題開(kāi)始,從簡(jiǎn)單題開(kāi)始零基礎(chǔ)python刷leetcode之旅。
1.第一題:Two Sum
首先過(guò)一下python的一些基礎(chǔ)知識(shí),非小白請(qǐng)直接跳過(guò)
self
self 只有在類(lèi)的方法中才會(huì)有,獨(dú)立的函數(shù)或方法是不必帶有self的。所以self名稱(chēng)不是必須的。另外,self也不是作為參數(shù)傳遞使用的,當(dāng)然也不是關(guān)鍵詞,只是約定成俗的寫(xiě)法,可以用a或b,甚至將self改為myself一樣沒(méi)有錯(cuò)誤。
self指的是類(lèi)實(shí)例對(duì)象本身(注意:不是類(lèi)本身),相當(dāng)于Java 的this
rang
>>> range(1,5) #代表從1到5(不包含5)
[1, 2, 3, 4]
>>> range(1,5,2) #代表從1到5,間隔2(不包含5)
[1, 3]
>>> range(5) #代表從0到5(不包含5)
[0, 1, 2, 3, 4]
append
>>>mylist = [1,2,0,'abc']
>>>mylist
[1, 2, 0, 'abc']
>>> mylist.append(4)
>>> mylist
[1, 2, 0, 'abc', 4]
時(shí)間戳
import time
import datetime
t = time.time()
print (t) #原始時(shí)間數(shù)據(jù)
print (int(t)) #秒級(jí)時(shí)間戳
print (int(round(t * 1000))) #毫秒級(jí)時(shí)間戳
nowTime = lambda:int(round(t * 1000))
print (nowTime()); #毫秒級(jí)時(shí)間戳,基于lambda
print (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) #日期格式化
str() 排序
str() 函數(shù)將對(duì)象轉(zhuǎn)化為適于人閱讀的形式。
>>>s = 'RUNOOB'
>>> str(s)
'RUNOOB'
>>> dict = {'runoob': 'runoob.com', 'google': 'google.com'};
>>> str(dict)
"{'google': 'google.com', 'runoob': 'runoob.com'}"
>>>
題目
輸入一個(gè)數(shù)組和target,要在一個(gè)數(shù)組中找到兩個(gè)數(shù)字,其和為target,從小到大輸出數(shù)組中兩個(gè)數(shù)字的位置。題目中假設(shè)有且僅有一個(gè)答案
方法一:暴力解決方法
import time
class Solution(object):
def twoSum(self, nums, target):
result = []
t1 = time.time()
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
result.append(i)
result.append(j)
print(time.time() - t1)
return result
最簡(jiǎn)單的循環(huán)嵌套,時(shí)間復(fù)雜度是O(n*n)。還有沒(méi)有更好的算法嗎?
方法二:字典
python字典的key-value原理屬于hashtable的范疇,Python中最常用的數(shù)據(jù)類(lèi)型之一,它是一個(gè)鍵值對(duì)的集合,字典通過(guò)鍵來(lái)索引,關(guān)聯(lián)到相對(duì)的值,理論上它的查詢(xún)復(fù)雜度是 O(1) :
首先,我們建立一個(gè)字典,d = {},字典的key是數(shù)組的值num(key一般是已知確定的值,所以用num),value是相應(yīng)的位置, 然后只要滿(mǎn)足 num 和 target - num都在字典里面則找到答案。這種方法的時(shí)間復(fù)雜度是(O(n))。
class Solution(object):
def twoSum(self, nums, target):
size = 0
d = {}
while size < len(nums):
#先把數(shù)組存到字典里面
if not nums[size] in d:#key不在字典里,進(jìn)行賦值
d[nums[size]] = size
if target - nums[size] in d:# nums[size] 和 target - nums[size]都在字典里,即存在和為他人個(gè)體/的兩個(gè)數(shù)
# 這里key 有可能指向同一個(gè)數(shù)(即 target - nums[size] = nums[size]時(shí),他其實(shí)只有一個(gè)數(shù))
if d[target - nums[size]] < d[nums[size]]:
# d的值從小到大輸出
result = [d[target - nums[size]], d[nums[size]]]
return result
# 注意size = size + 1是和最外層的if平級(jí)的
size = size + 1