Leetcode 300 最長上公升子串行

2021-09-13 18:34:56 字數 1404 閱讀 7544

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:

輸入:[10,9,2,5,3,7,101,18]輸出:4解釋:最長的上公升子串行是[2,3,7,101],它的長度是4。
說明:

高階:你能將演算法的時間複雜度降低到 o(n log n) 嗎?

動態規劃:

o(n^2)的狀態很好定義:dp[i]表示以nums[i]結尾的最長子序列,狀態轉換方程為 dp[i] = max(1,max(dp[i-1],dp[i-2],....dp[0]))

上面dp[i]的定義復合一般定義狀態的小套路(一般性的小套路見但是o(nlogn)的方法也一定要理解並掌握,因為面試的時候如果只寫出o(n^2)面試官一定會讓對其優化。直接設計o(nlogn)的狀態可能一時先不到,但是可以從時間複雜度的形式逆向考慮,既然是o(nlogn),而且最外層迴圈不可能優化,那麼只能優化內層迴圈為o(logn),完美知道二分查詢是o(logn)的時間複雜度,但是要求待查詢的序列排好順序。也就是要求我們設計的dp陣列的狀態是排好順序的。定義dp[i]表示長度為i+1的子串行最後元素的最小值,

i=0  dp[0] = 10

i=1  9<10 替換dp[0] = 9

i=2 2<9    替換dp[0] = 2

i=3 5>2    將5加入dp,dp[0] = 2, dp[1] = 5

i=4 7>5    將7加入dp,dp[0] = 2, dp[1] = 5,dp[2] = 7

i=5 101>7 將101加入dp,dp[0] = 2, dp[1] = 5,dp[2] = 7,dp[3] = 101

i=6 18<101 替換dp[3] = 18

o(n^2)

int lengthoflis(vector& nums) ,ans = 1;

for(int i=0;i=0)

dp[i] = max(1,tmp+1);

ans = max(ans,dp[i]);

}return ans;

}

o(nlogn)

int lengthoflis(vector& nums) ,maxl = 1;

dp[0] = nums[0];

for(int i=0;i=nums[i]) r = mid;

else l = mid + 1;

}dp[l] = nums[i];

if(l == maxl) maxl++;

}return maxl;

}

LeetCode300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 題目分析 方法一 動態規劃,用dp i 表示以nums i 結尾的最長上公升子串行。那麼如何求dp i 呢,只要看n...

Leetcode 300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?解題思路 1.普通演算法 動態規劃。假設陣列的前n個數...

leetcode 300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?解法1 動態規劃空間複雜度o n 時間複雜度o n 2...