题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
import java.util.Arrays;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
int[] inputAllNum = new int[n];
int[] groupNum = new int[n];
if (n <= 1) { //如果只输入了一个数字则
System.out.println(0);
}
for (int i = 0; i < n ; ++i) {
inputAllNum[i] = in.nextInt();
}
int[] left = new int[n];
int[] right = new int[n];
int[] cnt = new int[n];
left[0] = inputAllNum[0];
// 左侧计算子序列个数
int index = 1;
for (int i = 0; i < n ; i++) {
if (inputAllNum[i] > left[index - 1]) {
cnt[i] = index;
left[index++] = inputAllNum[i];
} else {
int l = 0, r = index - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (left[mid] < inputAllNum[i]) {
l = mid + 1;
} else {
r = mid;
}
}
left[l] = inputAllNum[i];
cnt[i] = l;
}
}
right[0] = inputAllNum[n - 1];
// 右侧计算子序列个数
index = 1;
for (int i = n-2; i >= 0 ; i--) {
if (inputAllNum[i] > right[index - 1]) {
cnt[i] += index;
right[index++] = inputAllNum[i];
} else {
int l = 0, r = index - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (right[mid] < inputAllNum[i]) {
l = mid + 1;
} else {
r = mid;
}
}
right[l] = inputAllNum[i];
cnt[i] += l;
}
}
int max = 1;
for(int num : cnt){
if( max < num){
max = num;
}
}
System.out.println(n - max -1);
}
}
private static int MaxGoup(int[] h, int[] copyh) {
int cut = 0;
int gMax = Integer.MIN_VALUE;
for (int i = 0 ; i < h.length ; ++i) {
gMax = Math.max(gMax, h[i]);
if (gMax == copyh[i]) {
cut ++;
}
}
return cut;
}
}
