71、最长上升子序列II

最长上升子序列II

题目描述

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

输入格式

第一行包含整数N。

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

输出格式

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

数据范围

1 ≤ N ≤ 100000 , 1≤N≤100000, 1N100000
− 1 0 9 ≤ 数列中的数 ≤ 1 0 9 −10^9≤数列中的数≤10^9 109数列中的数109

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4

Solution

import java.util.*;

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        // N 为 100000, n 方的做法会 TLE
        int[] a = new int[N + 10];
        // res[i] 数组记录长度为 i 时,所有子序列中结尾最小的元素
        int[] q = new int[N + 10];
        // 初始化为 0
        int len = 0;
        for(int i = 1; i <= N; i++) {
            a[i] = sc.nextInt();
            // 二分查找优化时间复杂度 logn
            // 查找最后一个小于 a[i] 的值
            int idx = bsearch(q, len, a[i]);
            if(idx == len) {
                len++;
                q[len] = a[i];
            }
            else{
                if(q[idx + 1] > a[i]) q[idx + 1] = a[i];
            }
        }
        System.out.println(len);
        
    }
    public static int bsearch(int[] q, int n, int x){
        // 找最后一个小于 x 的位置
        // 如果都比 x 大的话返回 0
        // 从 1 到 n 开始二分
        int low = 1, high = n;
        while(low <= high){
            int mid = (low + high) / 2;
            if(q[mid] < x){
                if(mid == n || q[mid + 1] >= x) return mid;
                else low = mid + 1;
            }
            else high = mid - 1;
        }
        return 0;
    }
}

相关推荐

  1. 71上升序列II

    2024-06-16 07:00:01       9 阅读
  2. 70上升序列

    2024-06-16 07:00:01       5 阅读
  3. 公共上升序列——DP

    2024-06-16 07:00:01       34 阅读
  4. B3637 上升序列

    2024-06-16 07:00:01       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 07:00:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 07:00:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 07:00:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 07:00:01       18 阅读

热门阅读

  1. HTML5应用程序缓存:构建离线可用的Web应用

    2024-06-16 07:00:01       8 阅读
  2. 数据仓库数据集成开源工具

    2024-06-16 07:00:01       9 阅读
  3. 神经网络-文本-图像-音频-视频基础知识

    2024-06-16 07:00:01       10 阅读
  4. flinksql BUG : flink hologres-cdc source FINISHED

    2024-06-16 07:00:01       9 阅读
  5. python命名空间详解

    2024-06-16 07:00:01       8 阅读
  6. 搭建Python虚拟环境(三):Conda

    2024-06-16 07:00:01       9 阅读
  7. vuex是什么?如何使用?使用他的功能场景?

    2024-06-16 07:00:01       8 阅读
  8. Web前端经验:探索、挑战与成长的奇幻之旅

    2024-06-16 07:00:01       11 阅读
  9. mac编译dbgen出错rand::rngs::OsRng

    2024-06-16 07:00:01       9 阅读
  10. 深入浅出Spring Boot自动装配:让开发更轻松

    2024-06-16 07:00:01       8 阅读