該部落格結合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 依次輸...