月光宝盒的密码
Table of Contents
时间限制:
C/C++语言 1000MS;其他语言 3000MS
内存限制:
C/C++语言 131072KB;其他语言 655360KB
题目描述:
小希偶然得到了传说中的月光宝盒,然而打开月光宝盒需要一串密码。虽然小希并不知道密码具体是什么,但是月光宝盒的说明书上有着一个长度为 n (2 <= N <= 50000)的序列 a (-10^9 <= a[i] <= 10^9)的范围内。下面写着一段话:密码是这个序列的最长的严格上升子序列的长度(严格上升子序列是指,子序列的元素是严格递增的,例如: [5,1,6,2,4]的最长严格上升子序列为[1,2,4]),请你帮小希找到这个密码。
输入
第1行:
1个数N,N为序列的长度(2<=N<=50000)
第2到 N+1行:
每行1个数,对应序列的元素(-10^9 <= a[i] <= 10^9)
输出
一个正整数表示严格最长上升子序列的长度
样例输入
8 5 1 6 8 2 4 5 10
样例输出
5
import java.util.Scanner;
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] arr = new int[N];
int[] seqs = new int[N];
for(int i=0; i<arr.length;i++){
arr[i] = scanner.nextInt();
}
int _len = 0;
seqs[0] = arr[0];
for(int i=1;i<arr.length;i++){
if(seqs[_len]<arr[i]){
_len++;
seqs[_len]=arr[i];
}else{
int low =0;
int high = _len;
while(low<high){
int mid = low + (high-low)/2;
if(seqs[mid]>=arr[i]){
high = mid;
}else{
low = mid + 1;
}
}
seqs[low]=arr[i];
}
}
System.out.println(_len+1);
}
}