Javascript 合唱队

说明:

N 位同学站成一排,音乐老师要请其中的 (N - K) 位同学出列,使得剩下的 K 位同学排成合唱队形。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。合唱队形即身高从左往右递增,然后递减,只有一个高峰。

 

输入描述:

有多组用例,每组都包含两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开

输出描述:

最少需要几位同学出列

 

--------------------------------------------------个人笔记-------------------------------------------------

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
const arr = [];
rl.on('line', function (line) {
  if (line === "") {
    rl.close();
  } else {
    arr.push(line);
  }
});

rl.on("close", function() {

  const heightStrArr = arr.filter((item, index) => index % 2 === 1);

  heightStrArr.forEach(item => {

    const heightArr = item.split(" ").map(Number);
    const len = heightArr.length;
    const leftSerial = [];
    const rightSerial = [];
    const stuNumberArr = [];

    // 从左往右序列化
    for(let i = 0; i < len; i++) {
      leftSerial[i] = 1; // 是否作为队形的起点 1
      for(let j = 0; j < i; j++) {
        // 如果高于左边的其他人,符合队形的从左往右最多排到第几
        if (heightArr[i] > heightArr[j]) {
          leftSerial[i] = Math.max(leftSerial[j] + 1, leftSerial[i]);
        }
      }
    }

    // 从右往左序列化
    for(let i = len - 1; i >= 0; i--) {
      rightSerial[i] = 1;
      for(let j = len - 1; j > i; j--) {
        if (heightArr[i] > heightArr[j]) {
          rightSerial[i] = Math.max(rightSerial[j] + 1, rightSerial[i]);
        }
      }
    }

    // 排成合唱队形的同学人数
    for(let i = 0; i < len; i++) {
      stuNumberArr[i] = leftSerial[i] + rightSerial[i] - 1;
    }

    // 最多人数的合唱队和最少需要几位同学出列
    const maxNumber = Math.max(...stuNumberArr);
    const minOffNumber = len - maxNumber;
    console.log(minOffNumber);
  });
});

上一篇:[LeetCode] 738. Monotone Increasing Digits


下一篇:力扣【动态规划】-中等题-122买卖股票时期