LeetCode 300 最长上升子序列 O(n^2)普通解法

LeetCode 300 最长上升子序列 (LIS问题)O(n^2)普通解法

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

示例:

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

可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

Nums[ ] 数组表示输入的数组
状态定义:lis[ i ] 表示以 i 结尾的上升子序列的最长长度
状态转移:lis[ i ] 的值就是在所有 j 【0 ~i-1】下标中找满足 nums[j] < nums[i] ,在 lis[所有满足的下标 j] 中找最大的值 max,lis[i]的值为 max+1

代码

class Solution {
public:
    int lis[114514];
    int lengthOfLIS(vector<int>& nums) 
    {
        int len = nums.size();

        if(len == 0)
        {
            return 0;
        }
        
        lis[0] = 1;
        int mmax = 1;
        for(int i=1; i<=len-1; i++)
        {
            int max = 0;
            for(int j=i-1; j>=0; j--)
            {
                if(nums[j] < nums[i])
                {
                    if(lis[j] > max)
                    {
                        max = lis[j];
                    }
                }
            }
            lis[i] = max + 1;
            if(lis[i] > mmax)
            {
                mmax = lis[i];
            }
        }
        return mmax;
    }
};
发布了38 篇原创文章 · 获赞 1 · 访问量 480

猜你喜欢

转载自blog.csdn.net/weixin_44176696/article/details/104075083