码迷,mamicode.com
首页 > 其他好文 > 详细

最长递增子序列

时间:2019-08-11 17:45:07      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:tail   bin   nod   port   index   多个   nlog   i++   ann   

题目

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

给出长度为 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;
    }
}

最长递增子序列

标签:tail   bin   nod   port   index   多个   nlog   i++   ann   

原文地址:https://www.cnblogs.com/debugxw/p/11335464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!