劍指offer的Python實現(二)

2021-09-13 21:55:10 字數 3902 閱讀 7157

python方法大總結

方法一:直接min函式,有點像開掛

class solution:

def minnumberinrotatearray(self, rotatearray):

# write code here

if not rotatearray:

return 0

else:

return min(rotatearray)

方法二:先sort排序

class solution:

def minnumberinrotatearray(self, rotatearray):

# write code here

if not rotatearray:

return 0

else:

rotatearray.sort()

return rotatearray[0]

方法三:二分查詢

class solution:

def minnumberinrotatearray(self, rotatearray):

# write code here

length = len(rotatearray)

if length == 0:

return 0

elif length == 1:

return rotatearray[0]

else:

left = 0

right = length - 1

while left < right:

mid = (left + right)/2 找中間值應該放在迴圈的裡邊

if rotatearray[mid] < rotatearray[j]:

right = mid

else:

left = mid+1

return rotatearray[i]

方法四:比較

class solution:

def minnumberinrotatearray(self, rotatearray):

# write code here

length = len(rotatearray)

if length == 0:

return 0

elif length == 1:

return rotatearray[0]

else:

for i in range(length-1):

if rotatearray[i] > rotatearray[i+1]:

return rotatearray[i+1]

return rotatearray[length-1]

自己寫的錯誤**:

#        p = 0

#        q = l - 1

#        x = rotatearray[l/2]

#        while p+1 == q:

#            if rotatearray[p] < x:

#                p = l/2

#            elif rotatearray[q] > x:

#                q = l/2

#            else:

#                return true

#        return max(rotatearray[p],rotatearray[q])

二分法怎麼學的,都不會寫

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。n<=39

遞迴可以解決,但是會有很嚴重的效率問題。

更簡單的辦法是從下往上計算,首先根據f(0)和f(1)算出f(2),再根據f(1)和f(2)算出f(3),..,以此類推,可以算出第n項了。時間複雜度為o(n)。

用迴圈:

# -*- coding:utf-8 -*-

class solution:

def fibonacci(self, n):

# write code here

if n == 0:

return 0

elif n == 1:

return 1

else:

fib0 = 0

fib1 = 1

fibn = 0

for i in range(2,n+2):

fibn = fib0 + fib1

fib1 = fib0

fib0 = fibn

return fibn

第二種:   

# -*- coding:utf-8 -*-

class solution:

def fibonacci(self,n):

if n == 0:

return 0

elif n ==1:

return 1

else:

a = 0

b = 1

for i in range(2,n+1):

a,b = b,a+b

return b

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。

同上題,也是斐波那契數列

# -*- coding:utf-8 -*-

class solution:

def jumpfloor(self, number):

# write code here

if number == 1:

return 1

elif number ==2:

return 2

else:

a = 1

b = 2

for i in range(3,number+1):

a,b = b,a+b

return b

乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

推算得知2(n-1)種跳法

# -*- coding:utf-8 -*-

class solution:

def jumpfloorii(self, number):

# write code here

return 2**(number-1)

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

先把2*8的覆蓋方法記為f(8),用第乙個1*2小矩形去覆蓋大矩形最左邊時有兩個選擇,當豎著放的時候,右邊還剩2*7的區域,這種情形下的覆蓋方法記為f(7)。接下來考慮橫著放的情況,當1*2的小矩形橫著放左上角的時候,左下角必須再橫著放乙個1*2的小矩形,而在右邊還剩下2*6的區域,這種情形下的覆蓋方法記為f(6), 因此f(8) = f(7) + f(6), 因此還是斐波那契數列。

# -*- coding:utf-8 -*-

class solution:

def rectcover(self, number):

# write code here

if number == 0:

return 0

elif number ==1:

return 1

elif number ==2:

return 2

else:

a ,b = 1,2

for i in range(3, number+1):

a, b = b, a+b

return b

劍指offer 陣列的旋轉(1)Python實現

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。考點 二分查詢 鏈結 一 鏈結二。分析 旋轉之後的陣列實際上可以劃分...

劍指offer 斐波那契數列 python 實現

題目描述 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 判斷n是否為0,1,2,對應特殊值 否則返回第n項的結果。注 迴圈可通過,但遞迴不行。coding utf 8 class solution def fibonacci self,...

劍指offer 矩形覆蓋 python

我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?假設是乙個2 8的大矩形有f 8 種放的方法,當第乙個豎著放,那後面就有f 7 種放的方法 當第乙份橫著放,而下面那個空間也必須橫著放,剩下的就有f 6 種放的方法,那就總...