300 最長上公升子串行

2021-09-25 23:21:35 字數 1022 閱讀 8868

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

示例:

輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是4。

說明:

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

思路:遍歷一遍給定陣列,維護乙個陣列dp,dp[i]表示長度為i的lis的最小結尾,具體操作過程如下:

1、遍歷到10,dp[1]=10,長度為1的lis的最小末尾是10

2、遍歷到9,比10小,更新dp[1]=9,長度為1的lis的最小末尾是9

3、遍歷到2,比9小,更新dp[1]=2,長度為1的lis的最小末尾是2

4、遍歷到5,比2大,新增dp[2]=5,長度為2的lis的最小末尾是5

5、遍歷到3,比5小,更新dp[2]=3,長度為2的lis的最小末尾是3

6、遍歷到7,比3大,新增dp[3]=7,長度為3的lis的最小末尾是7

7、遍歷到101,比7大,新增dp[4]=101,長度為4的lis的最小末尾是101

8、遍歷到18,比101小,更新dp[4]=18,長度為4的lis的最小末尾是18

於是我們知道了lis的長度為4。

注意,這個2, 3, 7, 18不是lis,它只是儲存的對應長度lis的最小末尾。有了這個末尾,我們就可以乙個乙個地插入資料。

總結一下:遍歷nums,每次採用二分查詢法去dp中找最小的比nums[i]大的數:找到了,就用nums[i]進行替換;找不到就將nums[i]新增到dp的末尾,查詢過程同35. 搜尋插入位置,時間複雜度降低到了o(nlogn) 。

class solution 

if(lelse dp.push_back(x);

}return dp.size();

}};

300 最長上公升子串行

建立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...

300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10 9,2 5,3 7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。你演算法的時間複雜度應該為 o n2 高階 你能...

300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。你演算法的時間複雜度應該為 o n2 高階 你能將...