题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void (async function () { const num = parseInt(await readline()); const list = (await readline()) .split(" ") .map((item) => Number(item)) .slice(0, num); let maxLen = 0; let leftArr = []; // 记录每个同学从左到右可以与其左边的同学组队的人数 let rightArr = []; // 记录每个同学从右到左可以与其右边的同学组队的人数 for(let i = 0, m = num - 1; i < num; i++ , m--) { leftArr[i] = 1; // 设置初始值为1 因为当前同学也属于组队的人数 rightArr[m] = 1;// 设置初始值为1 因为当前同学也属于组队的人数 for(let j = 0; j < i; j++) { // 判断 i 位置同学的身高 是否大于 j 位置同学的身高 // 如果大于,那么 i 同学可以组队的人数等于 j 同学可组队人数 + 1 // 由于我们要取最大的组队人数,所以需要判定 j 同学可组队人数是否大于 i 同学当前可组队人数 // 如果是的话 就把 j 同学可组队人数 + 1 赋值给 i 同学可组队人数 if(list[i] > list[j]) { leftArr[i] = Math.max(leftArr[i], leftArr[j] + 1); // 组队人数 } } // 同上 for(let n = num - 1; n > m; n--) { if(list[m] > list[n]) { rightArr[m] = Math.max(rightArr[m], rightArr[n] + 1); } } } let result = 0; // 拿到可组队的最大人数 for(let i = 0; i < num; i++) { result = Math.max(result, leftArr[i] + rightArr[i] - 1); } console.log(num - result); })();