也算是一种动态规划

新建一个数组,单调递增,数组中的数字upVec[i]表示长度为n的最小子序列,数组的长度就是最终子序列的长度。

新来一个元素,如果他大于数组中的所有数字,则插入到末尾, 否则,把第一个大于他的数字变成他。 假设upVec = [1,3,5], 如果来了7,则变成 [1,3,5,7],如果之后再来了2, 则变成[1,2,5,7]; (表示长度为2的子序列末尾最小值是2,因为他的前面只有1比他小)。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 该数组最长严格上升子序列的长度
     * @param a int整型vector 给定的数组
     * @return int整型
     */
    int LIS(vector<int>& a) {
        vector<int> upVec;
        for (auto it = a.begin(); it != a.end(); it++) {
            auto itVec = lower_bound(upVec.begin(), upVec.end(), *it);
            if (itVec == upVec.end()) {
                upVec.push_back(*it);
            } else {
                *itVec = *it;
            }
        }
        return upVec.size();
    }
};