動態規劃和分治法的區別
動態規劃也是一種分治思想(比如其狀態轉移方程就是一種分治),但與分治演算法不同的是,分治演算法是把原問題分解為若干個子問題,自頂向下求解子問題,合併子問題的解,從而得到原問題的解。動態規劃也是把原始問題分解為若干個子問題,然後自底向上,先求解最小的子問題,把結果存在**中,在求解大的子問題時,直接從**中查詢小的子問題的解,避免重複計算,從而提高演算法效率。
******************************===
分治法解題思路:
定義基本情況。
將問題分解為子問題並遞迴地解決它們。
合併子問題的解以獲得原始問題的解。
*************************
給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
在此題的情況下:
1.取陣列中心點為p,最大的連續子陣列要麼在p的左邊,要麼在p的右邊,要麼穿過p,一共有三種基本情況。
2.p左邊的陣列再取中心點,求最大子陣列和
p右邊的陣列再取中心點,求最大子陣列和
3.合併最大的子陣列和
)在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
題解:歸併排序:
如果將陣列1【2,3,4,5】與陣列2【1,5,6,8】合併,陣列1在陣列2之前。首先合併2與1中的最小值1。由於2比1大,陣列1中的所有數都比1大且都能構成逆序對,逆序對總數加4,以此類推。
class
solution
:def
mergesort
(self, nums, tmp, l, r)
:if l >= r:
return
0 mid =
(l + r)//2
inv_count = self.mergesort(nums, tmp, l, mid)
+ self.mergesort(nums, tmp, mid +
1, r)
i, j, pos = l, mid +
1, l
while i <= mid and j <= r:
if nums[i]
<= nums[j]
: tmp[pos]
= nums[i]
i +=
1 inv_count +=
(j -
(mid +1)
)else
: tmp[pos]
= nums[j]
j +=
1 pos +=
1for k in
range
(i, mid +1)
: tmp[pos]
= nums[k]
inv_count +=
(j -
(mid +1)
) pos +=
1for k in
range
(j, r +1)
: tmp[pos]
= nums[k]
pos +=
1 nums[l:r+1]
= tmp[l:r+1]
return inv_count
defreversepairs
(self, nums: list[
int])-
>
int:
n =len(nums)
tmp =[0
]* n
return self.mergesort(nums, tmp,
0, n -
1)
珍寶鴨的力扣練習(14) 棧操作合集
通用方法 輔助棧 考慮借用乙個輔助棧 stack 模擬 壓入 彈出操作的排列。根據是否模擬成功,即可得到結果。輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 是某棧的壓棧序列,序列 是該壓棧序列對應的乙個彈出序列,但 就不...
珍寶鴨的力扣練習(1) 字串特殊方法合集
方法2 字典序的利用 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 輸入 haystack hello needle ll 輸出 2 kmp演算法 分為兩部分,b陣列 和 正式...
力扣日常練習
給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。解題 根據題目需求首先過濾掉非字母和數字的字元,緊接著通過雙指標首尾遍歷字串,判斷是否回文即可。只需五行 即可。class solution 設計乙個支援 push,pop,t...