题解 | #合唱队#

合唱队

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);
})();

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 12:10
点赞 评论 收藏
分享
07-10 12:17
已编辑
商丘师范学院 Java
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
无实习如何秋招上岸
点赞 评论 收藏
分享
05-29 22:11
门头沟学院 Java
Elastic90:抛开学历造假不谈,这公司的招聘需求也挺怪的,Java开发还要求你有图文识别、移动端开发和c++的经验,有点逆天了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务