leetcode(动态规划)Longest Increasing Subsequence

https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/51/dynamic-programming/107/

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

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4

说明:

  • 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
  • 你算法的时间复杂度应该为 O(n2) 。

进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

这题目似乎夏令营机试也遇到过呀,动态规划真厉害

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();
        if(n==0) return 0;
        int dp[n];//dp[i]代表以nums[i]为最后节点的最长升序子序列的长度
        dp[0]=1;
        for(int i=1;i<n;i++)
        {
            int maxlen=INT_MIN;
            for(int j=0;j<i;j++)
            {
                if(nums[j]<nums[i])
                {//以nums[j]为倒数第二个元素,以nums[i]为最后一个元素,计算这样一个升序子序列的长度
                    if(dp[j]+1>maxlen)
                    {
                        maxlen=dp[j]+1;
                    }
                }
            }
            if(maxlen==INT_MIN){//说明nums[i]比之前的数字都小
                dp[i]=1;
            }
            else dp[i]=maxlen;
        }
        int max=INT_MIN;
        for(int i=0;i<n;i++){//选出最长的升序子序列
            if(dp[i]>max) max=dp[i];
        }
        return max;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41519463/article/details/88412865