今天的題目不是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...