最长递增子序列

Posted debugxw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长递增子序列相关的知识,希望对你有一定的参考价值。

题目

题目连接:最长递增子序列

给出长度为 N 的数组,找出这个数组的最长递增子序列。递增子序列是指,子序列的元素是递增的。

例如:5 1 6 8 2 4 5 10,最长递增子序列是 1 2 4 5 10

AC 代码

演示样例

import java.util.Scanner;

/**
 * 定义ans[k]为长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素。
 *
 * 首先len = 1,ans[1] = array[1]
 * 遍历array[i],若array[i]>ans[len],那么ans[++len] = array[i]
 * 否则,我们要从ans[1]到ans[len-1]中找到一个j,满足ans[j-1]<array[i]<=ans[j]
 *
 * 则根据ans的定义,我们需要更新长度为j的上升子序列的最末元素(使之为最小的)即 ans[j] = array[i]
 *
 * 最终答案就是len
 *
 * ans中元素是单调递增的,利用这个特性,在查找j的时候可以二分查找,从而时间复杂度为O(nlogn)
 *
 */
public class Main 

    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] array = new int[n];
        for (int i = 0; i < n; i++)
            array[i] = scanner.nextInt();
        int[] ans = new int[n + 1];
        ans[1] = array[0];
        int len = 1;
        for (int i = 1; i < n; i++) 
            if (array[i] > ans[len]) 
                ans[++len] = array[i];
             else 
                int pos = binarySearch(array, i, ans, len);
                ans[pos] = array[i];
            
        
        System.out.println(len);
    

    public static int binarySearch(int[] array, int index, int[] ans, int len) 
        int left = 1, right = len, mid;
        while (left < right) 
            mid = (left + right) >> 1;
            if (ans[mid] >= array[index])
                right = mid;
            else
                left = mid + 1;
        
        return left;
    

以上是关于最长递增子序列的主要内容,如果未能解决你的问题,请参考以下文章

笔试题1:最长严格递增子序列

O(nlogn)最长递增子序列算法,如何输出所求子序列?

最长递增子序列

算法 LC 动态规划 - 最大递增子序列

[网络流24题] 最长递增子序列

动态规划之最大递增子序列