給你乙個整數陣列 nums ,找到其中最長嚴格遞增子串行的長度。
子串行是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子串行。
示例 1:
輸入:nums = [10,9,2,5,3,7,101,18]
輸出:4
解釋:最長遞增子串行是 [2,3,7,101],因此長度為 4 。
示例 2:
輸入:nums = [0,1,0,3,2,3]
輸出:4
dpdp,
初始化dp陣列,
找固定狀態
找狀態跳轉的關係
如果nums中當前值比nums陣列中前乙個值大,那麼dp陣列中的當前值是:dp陣列中前乙個值+1,和dp當前的初始值的最大值。
如果最後返回return dp[n-1];
就有情況是錯的,所以找乙個res一直儲存最後的結果
複習之前做過的題,思路
方法1,時間複雜度:平方:
class
solution
} res=
max(res,dp[i]);
// 結果
}return res;}}
;
方法2:時間複雜度更低:
int
lengthoflis
(vector<
int>
& nums)
vector<
int>
d(n +1,
0); d[len]
= nums[0]
;for
(int i =
1; i < n;
++i)
else
else
} d[pos +1]
= nums[i];}
}return len;
}
給定乙個未排序的整數陣列,找到最長遞增子串行的個數。
示例 1:
輸入: [1,3,5,4,7]
輸出: 2
解釋: 有兩個最長遞增子串行,分別是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
示例 2:
輸入: [2,2,2,2,2]
輸出: 5
解釋: 最長遞增子串行的長度是1,並且存在5個子序列的長度為1,因此輸出5。
注意: 給定的陣列長度不超過 2000 並且結果一定是32位有符號整數。
在原來的基礎上,初始化dp陣列的時候,做乙個統計cnt,當前元素i,為最長遞增子串行的最後乙個元素時,最長遞增子串行的個數。
class
solution
else
if(dp[j]+1
== dp[i])}
}if(dp[i]
> maxlen)
else
if(dp[i]
== maxlen)
}return res;}}
;
最長遞增子串行 LIS
對於這個問題,最直觀的dp方法是cnt i 表示以height i 結束的最長遞增子串行的元素的個數,遞迴方程是cnt i max for max i 0 i求出整個數列的最長遞增子串行的長度 if b i max max b i cout return 0 顯然,這種方法的時間複雜度仍為o n 2...
最長遞增子串行 LIS
給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.這個問題可以轉換為最長公共子串行問題。如例子中的陣列a,則我們排序該陣列得到陣列a 然後找出陣列a和a 的最長公共子串行即可。顯然這裡最長公共子串行...
最長遞增子串行(LIS)
300.longest increasing subsequence good 給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行 不一定連續,當時先後順序不能亂 更正式的定義是 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1。比如陣列a 為,那麼最長遞增子串行為。以...