题解 | #合唱队#复杂度O(N),最大前缀和最大后缀
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int size = Integer.parseInt(in.nextLine()); String input = in.nextLine(); String[] split = input.split(" "); int[] heights = new int[size]; for (int i = 0; i < size; i++) { heights[i] = Integer.parseInt(split[i]); } // 正向统计最大增长队列长度 int[] maxQueue = new int[size]; Arrays.fill(maxQueue, 1); for (int i = 1; i < size; i++) { int max = 0; for (int j = i - 1; j >= 0; j--) { if (heights[i] > heights[j] && maxQueue[j] > max) { maxQueue[i] = maxQueue[j] + 1; max = maxQueue[j]; // break; } } } // 反向统计最大增长队列长度 int[] maxQueueReversed = new int[size]; Arrays.fill(maxQueueReversed, 1); for (int i = size - 2; i >= 0; i--) { int max = 0; for (int j = i + 1; j <= size - 1; j++) { if (heights[i] > heights[j] && maxQueueReversed[j] > max) { maxQueueReversed[i] = maxQueueReversed[j] + 1; max = maxQueueReversed[j]; // break; } } } // 合并统计结果,算出构建最长合唱队需要剔出的人数 int maxLength = 0; for (int i = 0; i < size; i++) { maxQueue[i] = (maxQueue[i] + maxQueueReversed[i] - 1); maxLength = Math.max(maxLength, maxQueue[i]); } System.out.println(size - maxLength); } }#暴力的不能再暴力了#