最长上升子序列(元素可以不连续)

最长上升子序列

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章