最长上升子序列 II

题目描述

给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。

输入

第一行包含整数N。

第二行包含N个整数,表示完整序列。

输出

输出一个整数,表示最大长度。

样例输入 Copy

7
3 1 2 1 8 5 6

样例输出 Copy

4

提示

1 ≤ N ≤ 10000
1 ≤ N ≤ 100000
−1e9 ≤ 数列中的数 ≤ 1e9
 
lower_bound() 函数用于在指定区域内查找不小于目标值的第一个元素

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<int> arr(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> arr[i];

    vector<int> stack;
    stack.push_back(arr[1]);

    for (int i = 2; i <= n; i++)
    {
        if (arr[i] > stack.back())
        {
            stack.push_back(arr[i]);
        }
        else
        {
            *lower_bound(stack.begin(), stack.end(), arr[i]) = arr[i];
        }
    }

    cout << stack.size() << endl;

    return 0;
}

 

/*
例 n: 7
arr : 3 1 2 1 8 5 6

stack : 3

1 比 3 小
stack : 1

2 比 1 大
stack : 1 2

1 比 2 小
stack : 1 2

8 比 2 大
stack : 1 2 8

5 比 8 小
stack : 1 2 5

6 比 5 大
stack : 1 2 5 6

stack 的长度就是最长递增子序列的长度

*/

 

posted @ 2022-02-23 20:44  ora12321  阅读(12)  评论(0)    收藏  举报