珍寶鴨的力扣練習(7) 分治法題目合集

2021-10-04 10:27:50 字數 3369 閱讀 9813

動態規劃和分治法的區別

動態規劃也是一種分治思想(比如其狀態轉移方程就是一種分治),但與分治演算法不同的是,分治演算法是把原問題分解為若干個子問題,自頂向下求解子問題,合併子問題的解,從而得到原問題的解。動態規劃也是把原始問題分解為若干個子問題,然後自底向上,先求解最小的子問題,把結果存在**中,在求解大的子問題時,直接從**中查詢小的子問題的解,避免重複計算,從而提高演算法效率。

******************************===

分治法解題思路:

定義基本情況。

將問題分解為子問題並遞迴地解決它們。

合併子問題的解以獲得原始問題的解。

*************************

給定乙個整數陣列 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...