leetcode 300 最長上公升子串行

2021-09-26 02:21:21 字數 2114 閱讀 5843

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

示例:

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

輸出: 4

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

思路一:動態規劃

dp[i]:表示以第 i 個數字為結尾的「最長上公升子串行」的長度。即在 [0, …, i] 的範圍內,選擇 以數字 nums[i] 結尾 可以獲得的最長上公升子串行的長度。注意:以第 i 個數字為結尾,即 要求 nums[i] 必須被選取。

初始化的時候,因為每個元素自己可以認為是乙個長度為 1 的子串行,所以可以將 dp 陣列的值全部設定為 1。

定義輸出:下面要考慮一下輸出,由於狀態不是題目中的問法,因此不能將最後乙個狀態作為輸出,這裡輸出是把 dp[0]、dp[1]、……、dp[n - 1] 全部看一遍,取最大值。

遍歷到索引是 i 的數的時候,根據上面「狀態」的定義,考慮把 i 之前的所有的數都看一遍,只要當前的數 nums[i] 嚴格大於之前的某個數,那麼 nums[i] 就可以接在這個數後面形成乙個更長的上公升子串行。因此,dp[i] 就是之前嚴格小於 nums[i] 的「狀態」最大值加 1。

因此,狀態轉移方程是:

dp[i] = max

class solution 

int dp = new int[nums.length];

arrays.fill(dp,1);

int max = 1;

for (int i = 1;i < nums.length;i++)

}max = math.max(max,dp[i]);

}return max;

}}

時間複雜度:o(n^2),因為有兩個 for 迴圈,每個 for 迴圈的時間複雜度都是線性的。

空間複雜度:o(n),要開和陣列等長的狀態陣列,最後要拉通看一遍狀態陣列的最大值,因此空間複雜度是 o(n)。

這樣在一些筆試中會出現超時的情況,因為還不是最優解,可以考慮在子問題遍歷過程中使用二分的思路

思路二:貪心演算法 + 二分

注意:arrays.binarysearch() 方法返回搜尋鍵的索引,如果它包含在陣列中,則返回((插入點)-1)。

1、設定乙個有序陣列 tail,初始時為空;

陣列命名為 tail 即 ppt 中各個行表示的陣列(是乙個「上公升子串行」)的結尾,注意:有序陣列 tail 雖然有「上公升」的性質,但它不是每時每刻都表示問題中的「最長上公升子串行」(下文還會強調),不能命名為 lis,有序陣列 tail 是用於求解 lis 問題的輔助陣列。

2、在遍歷陣列 nums 的過程中,每來乙個新數 num,如果這個數嚴格大於有序陣列 tail 的最後乙個元素,就把 num 放在有序陣列 tail 的後面,否則進入第 3 點;

注意:這裡的大於是「嚴格」大於,不包括等於的情況。

3、在有序陣列 tail 中查詢第 1 個等於大於 num 的那個數,試圖讓它變小;

如果有序陣列 tail 中存在等於 num 的元素,什麼都不做,因為以 num 結尾的最短的「上公升子串行」已經存在;

如果有序陣列 tail 中存在大於 num 的元素,找到第 1 個,讓它變小,這樣我們就找到了乙個「結尾更小」的「相同長度」的上公升子串行。

這一步可以使用「二分查詢法」。

4、遍歷新的數 num ,先嘗試上述第 2 點,第 2 點行不通則執行第 3 點,直到遍歷完整個陣列 nums,最終有序陣列 tail 的長度,就是所求的「最長上公升子串行」的長度。

class solution 

int n = nums.length;

int dp = new int[nums.length];

int end = 0;

dp[0] = nums[0];

for (int i = 1;i < nums.length;i++)else else

}dp[left] = nums[i];}}

return end + 1;

}}

時間複雜度:o(n log n),遍歷陣列使用了 o(n),二分查詢法使用了 o(log n)。

空間複雜度:o(n),開闢有序陣列 tail 的空間至多和原始陣列一樣。

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