leetcode 300 最長上公升子串行

2021-10-04 11:01:08 字數 1242 閱讀 3065

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

示例:

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

輸出: 4 

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

說明:可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。

你演算法的時間複雜度應該為 o(n2) 。

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

題目比較簡單,但是做起來不太容易。

首先看到題目差不多直到可以用動態規劃去解決。

利用動態規劃

狀態表示:f(i) 表示 1 到 i 最長上公升子串行。

狀態方程:要想求 f(i) 的話,需要遍歷 1到i-1,從中找出值不大於當前值並且長度最大的值,也就是 max(f(1),f(2)...f(i-1)),然後將其加一后即為所有的f(i)。即:f(i) = max(f(k)),其中k小於當前值。

//動態規劃

public int lengthoflis1(int nums)

}dp[i] = tmpmax + 1;

// 更新結果

if(res < dp[i])

res = dp[i];

}return res;

}

時間複雜度 o(n),空間複雜度 o(n^2),因為有乙個雙重迴圈,所以比較慢。

利用貪心加二分搜尋來解決。

維護乙個一位陣列,每次新增的位置使用二分查詢搜尋下標位置得到。

以陣列 [10, 9, 2, 5, 3, 4] 為例,陣列的變化過程如下

[10, 0, 0, 0, 0, 0]

[9, 0, 0, 0, 0, 0]

[2, 0, 0, 0, 0, 0]

[2, 5, 0, 0, 0, 0]

[2, 3, 0, 0, 0, 0]

[2, 3, 4, 0, 0, 0]

// 貪心 + 二分

public int lengthoflis2(int nums) else

}ns[start] = nums[i];

if(end == res)

res ++;

}return res;

}

利用貪心思想和二分查詢我們可以將演算法的時間複雜度降低到 o(nlogn)

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