leetcode演算法刷題 五 動態規劃 三

2022-07-20 18:51:11 字數 2035 閱讀 8348

今天的題目不是leetcode上面的。只是覺得動態規劃還是不算很熟練,就接著找了點dp的題練練

題目的意思:傳入乙個陣列,要求出它的最長遞增子串行的長度。例如:如在序列1,-1,2,-3,4,-5,6,-7中,最長遞增序列為1,2,4,6,所以長度為4。

分析:這道題我們可以用動態規劃來做。對於陣列的前i個元素,記l(i)為前i個最長遞增子串行的長度。我們可以得到狀態轉移方程:l(i) = max(l(j))+1, 其中j maxlong[leng-1]:

maxlong[leng] = li[i]

leng += 1

else:

pos = bisearch(li[i], leng, maxlong)

maxlong[pos] = li[i]

return leng

def bisearch(value, length, maxlong):

left = 0

right = length-1

while left <= right:

mid = (left+right)//2

if maxlong[mid] > value:

right = mid-1

elif maxlong[mid] < value:

left = mid+1

else:

return mid

return left題目的意思:從一列數中篩除盡可能少的數使得從左往右看,這些數是從小到大再從大到小的。

分析:這道題是上面那道題的變體。我們可以把這道題這樣看:

篩除數字後,陣列的0~i位是遞增數列,陣列的(len(li)-1)~i位是遞增數列。
其實這道題等效於求出這兩個數列的遞增數列長度(a[i],b[i]),再求出min(len(li)-a[i]-b[i]+1)

該方法利用了前一道題求最長遞增子串行長度的方法。

def maxlong(li):

maxlong = [0 for i in range(len(li))]

maxlong[0] = li[0]

leng = 1

for i in range(1,len(li)):

if li[i] > maxlong[leng-1]:

maxlong[leng] = li[i]

leng += 1

else:

pos = bisearch(maxlong, leng, li[i])

maxlong[pos] = li[i]

return leng

def bisearch(li, length, value):

left = 0

right = length-1

while left <= right:

mid = (right + left)//2

if li[mid] > value:

right = mid -1

elif li[mid] < value:

left = mid + 1

else:

return mid

return left

def mindelete(li):

a = [0 for i in range(len(li))]

b = [0 for i in range(len(li))]

c = 0

for i in range(len(li)):

li_a = li[:i+1]

a[i] = maxlong(li_a)

li_b = li[:i:-1]+[li[i]]

b[i] = maxlong(li_b)

for i in range(len(li)):

c = max(c, a[i]+b[i])

return len(li) -c +1

演算法題 LeetCode刷題(五)

資料結構和演算法是程式設計路上永遠無法避開的兩個核心知識點,本系列 演算法題 旨在記錄刷題過程中的一些心得體會,將會挑出leetcode等最具代表性的題目進行解析,題解基本都來自於leetcode官網 本文是第五篇。給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以...

LeetCode刷題 動態規劃(五)

上一節總結了 0 1揹包,接著總結 完全揹包。在做題中總結套路,事半功倍!引入322,零錢兌換,medium 518,零錢兌換 medium 377,組合總和 medium 139,單詞拆分,medium 完全揹包問題總結 引入 完全揹包的變體問題 物品可以無限次選取,且考慮物品放入的順序。下面在具...

演算法 LeetCode刷題

given 1,3 2,6 8,10 15,18 return 1,6 8,10 15,18 關鍵就是a 1 b 0 也就是array i 1 1 array i 0 const merge array return array console.log merge 1,3 8,10 2,6 15,1...