最長上升子序列
給定一個無序的整數數組,找到其中最長上升子序列的長度。
示例:
輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。
說明:
可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。
你算法的時間複雜度應該爲 O(n2) 。
解法(時間複雜度爲O(n^2) ):
題目中沒有要求是連續的,可以有間隔,實例中[2,5,7,101]也應該是一種。所以可以定義一個dp數組,用來記錄前面的最優解。最後dp中的最大值就是答案。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.empty())
return 0;
vector<int> dp(nums.size(),1);
int maxSon = dp[0]; // 整體最大值
for(int i=1;i<nums.size();i++){
int localMax = 0; // 前面局部最大的值
for(int j=0;j<i;j++){
if(nums[j] < nums[i]){
if(dp[j] > localMax)
localMax = dp[j];
}
}
dp[i] += localMax;
if(dp[i] > maxSon)
maxSon = dp[i];
}
return maxSon;
}
};