AcWing 896. 最长上升子序列 II - 贪心
原题链接
中等
作者:
acw_weian
,
2020-10-23 15:03:00
,
所有人可见
,
阅读 481
/**
* 贪心思路:较小的数开头的数作为的子序列 比 较大的数作为开头的子序列 更好.
* 贪心步骤:
* 开一个数组q记录所有上升子序列最大的数,q一开始是空集,长度为0
* 遍历每个数,对于当前这个数:
* 情况1:在q数组中若找不到比这个数更大的数,在数组q加入这个数字
* 情况2:在q数组中可以找到 >= 这个数的最小的数, 则将它替换到所找到的位置上
*
* 可以证明q数组必定是一个单调上升的数组
*/
import java.io.*;
import java.util.*;
class Main {
static BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
static int N = 100010;
static List<Integer> list = new ArrayList<>(N);
public static void main(String[] args) throws Exception{
int n = Integer.valueOf(read.readLine());
String[] ss = read.readLine().split(" ");
int size = 0;
for(int i = 0; i < n; i++){
int tmp = Integer.valueOf(ss[i]);
if(size == 0 || list.get(size - 1) < tmp){
list.add(tmp);
size++;
}else{
int l = 0, r = size - 1;
while (l < r){
int mid = l + r >> 1;
if(list.get(mid) >= tmp) r = mid;
else l = mid + 1;
}
list.set(l, tmp);
}
}
System.out.println(size);
}
}