資料結構演算法 遞迴 分治

2021-09-09 05:49:15 字數 3466 閱讀 7860

該部落格結合leetcode原題介紹了可以使用「分治」思想解決的常見題目。

#leetcode 50 pow(x, n)

(1)暴力解法

多少次冪,就乘上多少次x。但是提交的話會超時。

*時間複雜度:o(n)

*空間複雜度:o(1)

class

solution

(object):

defmypow

(self, x, n)

:"""

:type x: float

:type n: int

:rtype: float

"""res =

1if n<0:

for _ in

xrange

(-n)

: res = res * x

return

1.0/

float

(res)

elif n==0:

return

1else

:for _ in

xrange

(n):

res = res * x

return res

(2)分治,用遞迴實現

將問題拆成兩個子問題,再拆兩個子問題。

*時間複雜度:o(logn),很遺憾,依然超時。

*空間複雜度:o(1)

class

solution

(object):

defsubpow

(self, x, n)

:if n==0:

return

1if n%2==

0:return self.subpow(x,

int(n/2)

)* self.subpow(x,

int(n/2)

)else

:return x * self.subpow(x,

int(n /2)

)* self.subpow(x,

int(n /2)

)def

mypow

(self, x, n)

:"""

:type x: float

:type n: int

:rtype: float

"""res = self.subpow(x,

abs(n)

)if n>0:

return res

elif n==0:

return

1else

:return

1.0/

float

(res)

(3)分治,不用遞迴實現

*時間複雜度:o(logn)

*空間複雜度:o(1)

class

solution

(object):

defmypow

(self, x, n)

:"""

:type x: float

:type n: int

:rtype: float

"""if n<0:

x =1/x

n =-n pow=1

while n:

if n &1:

pow*= x

x *= x

n>>=1

return

pow

#leetcode 169 求眾數

(1)暴力解法

對數列中每個數迴圈一遍,找到大於n/2個數的數字。

*時間複雜度:o(n^2)

*空間複雜度:o(1)

class

solution

(object):

defmajorityelement

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""max_cnt =

0 max_num =

0for i in

range

(len

(nums)):

cnt =

0for j in

range

(len

(nums)):

if nums[i]

==nums[j]

: cnt +=

1if cnt>max_cnt:

max_cnt = cnt

max_num = nums[i]

if max_cnt>

len(nums)/2

:return max_num

return max_num

(2)排序解法

將陣列排序,找到最長連續段。

*時間複雜度:o(nlogn)

*空間複雜度:o(1)

class

solution

(object):

defmajorityelement

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""nums.sort(

) cnt =

1for i in

range(1

,len

(nums)):

if nums[i]

==nums[i-1]

: cnt +=

1else

:if cnt>

len(nums)/2

:return nums[i-1]

cnt =

1if cnt>

len(nums)/2

:return nums[-1

]

(3)使用hashmap

使用hashmap儲存每個元素的次數。

*時間複雜度:o(n)

*空間複雜度:o(n)

class

solution

(object):

defmajorityelement

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""mem =

for v in nums:

if v in mem:

mem[v]+=1

else

: mem[v]=1

for k, v in mem.items():

if v>

len(nums)/2

:return k

(4)分治遞迴

資料結構和演算法(遞迴和分治思想)

遞迴 乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱作遞迴函式 分治思想 將乙個問題分為幾個小的模組,逐一解決 輸入任意長度的字元,並反向輸出 遞迴 include void print if a int main void 斐波那契數列實現 迭代 遞迴 斐波拉契數列 include...

資料結構與演算法(3) 遞迴與分治思想

遞迴思想 遞迴就是有去 遞去 有回 歸來 有去 是指 遞迴問題必須可以分解為若干個規模較小,與原問題形式相同的子問題,這些子問題可以用相同的解題思路來解決,就像鑰匙可以開啟所有門上的鎖一樣 有回 是指 這些問題的演化過程是乙個從大到小,由近及遠的過程,並且會有乙個明確的終點 臨界點 一旦到達了這個臨...

資料結構 演算法 遞迴

遞迴在較為高階的數演算法實現中是常用的,比如深度優先搜尋,暴力搜尋。下面展示較為簡單的遞迴 執行的過程中。public void recurisve recurisve system.out.println str test public void test 測試 依次輸入是 k i h a 依次輸...