class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param seeds int整型vector
     * @return int整型
     */

    int lengthOfLIS(vector<int>& seeds) {
        // write code here
        int n = seeds.size();
        int dp[n];
        for (int i = 0; i < n; ++i)
            dp[i] = 1;
        int ans = 1;
        for (int i = 1; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                if (seeds[j] > seeds[i])
                    dp[i] = max(dp[i], dp[j] + 1);
            }
            ans = max(ans, dp[i]);
        }
        return ans;
    }
};

一、题目考察的知识点

dp

二、题目解答方法的文字分析

最长递增子序的模板题

我们往后遍历,每次遍历的同时,我们在当前数a[i]前面寻找比它小的数但又是小的数里面b[i]最大的数,找到了那我们便在以当前数结尾的LIS加一,同时更新ans的值。循环结束的时候,ans就是我们要求的值

最长递增子序列的可能有很多,但我们只要找到一条即可当前的算法时间复杂度为O(n^2);

缺点就是复杂度过大O(n^2)

可以用二分优化成n*log(n)

三、本题解析所用的编程语言

c++