最长递增子序列
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;
以上是关于最长递增子序列的主要内容,如果未能解决你的问题,请参考以下文章