列表

详情


NC164. 最长上升子序列(二)

描述

给定一个长度为 n 的数组a,求它的最长严格上升子序列的长度。
所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。但 [1,6]、[1,3,5] 则不是它的子序列。
我们定义一个序列是 严格上升 的,当且仅当该序列不存在两个下标 ij 满足
数据范围:
要求:时间复杂度 O(nlogn), 空间复杂度 O(n)

示例1

输入:

[1,4,7,5,6]

输出:

4

说明:

最长上升子序列为 [1,4,5,6] ,长度为4。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 21ms, 内存消耗: 4112KB, 提交时间: 2022-08-01

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    int LIS(vector<int>& a) {
        vector<int>res;
        for(int i:a)
        {
            auto it=lower_bound(res.begin(),res.end(),i);
            if(it==res.end())
                res.push_back(i);
            else *it=i;
        }
        return res.size();
    }
};

C++ 解法, 执行用时: 28ms, 内存消耗: 4208KB, 提交时间: 2022-02-10

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

C++ 解法, 执行用时: 29ms, 内存消耗: 4224KB, 提交时间: 2022-02-06

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

C++ 解法, 执行用时: 31ms, 内存消耗: 4228KB, 提交时间: 2021-11-29

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

C++ 解法, 执行用时: 31ms, 内存消耗: 4244KB, 提交时间: 2021-11-20

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

上一题