AcWing 896. 最长上升子序列 II java
原题链接
中等
作者:
zdkk
,
2021-07-19 13:08:21
,
所有人可见
,
阅读 208
类似于单调栈的思想
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = sc.nextInt();
//数组模拟单调栈,idx指向栈顶元素
//idx==-1说明栈为空
int[] f = new int[n];
int idx = -1;
//考虑数组a中的每个元素,将其加入栈中,始终保持栈中元素严格单调递增
for (int i = 0; i < n; i++) {
//栈为空或者当前a中元素大于栈顶元素,直接进栈
if (idx == -1 || a[i] > f[idx]) {
f[++idx] = a[i];
} else { //用a[i]更新栈中元素,替换栈中第一个大于等于a[i]的元素为a[i]
int l = 0, r = idx;
while (l < r) {
int mid = l + r >> 1;
if (f[mid] < a[i]) l = mid + 1;
else r = mid;
}
f[l] = a[i];
}
}
System.out.println(idx + 1);
}
}