题解 | #合唱队#

合唱队

http://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()){
            int n = sc.nextInt();
            int[] arr = new int[n];
            int[] arrL = new int[n]; // 左侧小于arr[i]的个数
            int[] arrR = new int[n]; // 右侧大于arr[i]的个数
            for(int i = 0; i < n; ++i){
                arr[i] = sc.nextInt();
            }

            for(int i = 0; i < n; ++i){
                arrL[i] = 0; // 所以默认初始是0,,对于第一个数来说, 在arr[0]的左侧小于arr[0]的个数是0。
                for(int j = 0; j < i; ++j){
                    if(arr[i] > arr[j]){
                        arrL[i] = Math.max(arrL[j] + 1, arrL[i]);
                    }
                }
            }

            for(int i = n - 1; i >= 0; --i){
                arrR[i] = 0; // 所以默认初始是0,,对于最后一个数来说, 在arr[n - 1]的右侧小于arr[0]的个数是0。
                for(int j = n - 1; j > i; --j){
                    if(arr[i] > arr[j]){
                        arrR[i] = Math.max(arrR[j] + 1, arrR[i]);
                    }
                }
            }

            int maxValue = 0;
            for(int i = 0; i < n; ++i){
                maxValue = Math.max(maxValue, arrR[i] + arrL[i] + 1);
            }

            System.out.println(n - maxValue);
        }
    }
}
全部评论
这解释。。。我觉得这其实是dp动态规划,arrL里存的是左边的最长递增子序列长度,arrR是从右边数的最长递增子序列长度
2 回复 分享
发布于 2022-02-15 17:38
大哥你要是从别处拷贝的代码就别自作聪明乱加注释好吗,误人子弟啊!!
2 回复 分享
发布于 2022-03-28 22:50
为什么要加1比较呢
点赞 回复 分享
发布于 2021-10-19 11:47
注释不对,思路应该是其中,left数组和right数组分别表示以每个同学为最高点时,左边最多能排几个人和右边最多能排几个人,遍历两次数组即可求出。 最后求出最大的能排成合唱队的人数,用总人数减去该数值即为最少需要出列的人数。
点赞 回复 分享
发布于 2023-07-24 13:44 上海

相关推荐

找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
评论
24
5
分享
牛客网
牛客企业服务