給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:
輸入: [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...