最長上公升、最長不下降、最長下降子串行等等類似的題目求子序列長度的題基本都是使用dp來解。還要注意題目中是否指定了是連續子串行還是沒有限制,若是連續的子串行就要注意dp代表的含義。還有的題目會使用刪除某些數字來獲得子串行來反向出題,都一樣。
本題是非連續的子串行,則dp[i]表示為從[0,i]的最長上公升子串行長度。因為是非連續的子串行,所以dp[i]的大小不一定取決於dp[i-1],因為若nums[i]<=nums[i-1]則dp[i]所代表的子串行肯定不包含nums[i-1]。而dp[i]代表的序列肯定是以nums[i]結尾的序列,因此針對dp[i]的求解需要從0到i都比較一次,若num[j]dp[
i]=m
ax(d
p[i]
,dp[
j]+1
)if(
nums
[j
] ms[i ]) j>0a nd j< idp[i]=max(dp[i],dp[j]+1) if(nums[j]0andjdp [i]= max( dp[i ],dp [j]+ 1)if (num s[j] ms[i ])j>0a ndj< i還有一種思路。初始化乙個cell陣列用來存放上公升子串行。每次迴圈,判斷cell中最後乙個元素cell[j]和nums[i]的大小,若cell[j] nums[j]) }re = re > dp[i] ? re : dp[i]; }return re; }public int lengthoflis(int nums) else r = mid; }cell[l] = nums[i];}} return cell.length;}} 給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?思路 遍歷一遍給定陣列,維護乙個陣列dp,dp i ... 建立dp表,dp i 表示含第i個數字的最長上公升子串行的長度 求dp i 時,向前遍歷找出比i元素小的元素j,則動態方程為dp i max dp i dp j 1 class solution object def lengthoflis self,nums size len nums if si... 給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10 9,2 5,3 7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。你演算法的時間複雜度應該為 o n2 高階 你能...300 最長上公升子串行
300 最長上公升子串行
300 最長上公升子串行