import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = in.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
int[] num = new
int[n]; // 记录从左到右和从右到左递增最长队列长度的加和
int[] left = new int[n]; // 记录从左到右递增的队列
int[] right = new int[n]; // 记录从右到左递增的队列
num[0] = 0;
left[0] = arr[0];
right[0] = arr[n - 1];
int index = 0;
for (int i = 1; i < n; i++) {
if (arr[i] > left[index]) {
left[++index] = arr[i];
num[i] = index;
} else {
int low = 0;
int high = index;
// 利用二分查找法找到arr[i]在left[]数组的位置
while (low < high) {
int mid = (low + high) / 2;
if (left[mid] < arr[i]) {
low = mid + 1;
} else {
high = mid;
}
}
num[i] = low;
left[low] = arr[i];
}
}
int rightIndex = 0;
for (int j = n - 2; j >= 0; j--) {
if (arr[j] > right[rightIndex]) {
right[++rightIndex] = arr[j];
num[j] += rightIndex;
} else {
int low = 0;
int high = rightIndex;
while (low < high) {
int mid = (low + high) / 2;
if (arr[j] > right[mid]) {
low = mid + 1;
} else {
high = mid;
}
}
num[j] += low;
right[low] = arr[j];
}
}
int max = 0;
for (int i = 0; i < n; i ++) {
max = Math.max(num[i], max);
}
// max是num里面的最大值,但是此处需要减去最高值本身
System.out.println(n - max - 1);
}
}
【华为机试java】HJ24 合唱队
于 2023-01-14 19:50:13 首次发布