IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 华为机试 HJ24 合唱队【java实现】 -> 正文阅读

[数据结构与算法]华为机试 HJ24 合唱队【java实现】

描述
N 位同学站成一排,音乐老师要请最少的同学出列,使得剩下的 K 位同学排成合唱队形。
通俗来说,能找到一个同学,他的两边的同学身高都依次严格降低的队形就是合唱队形。
例子:
123 124 125 123 121 是一个合唱队形
123 123 124 122不是合唱队形,因为前两名同学身高相等,不符合要求
123 122 121 122不是合唱队形,因为找不到一个同学,他的两侧同学身高递减。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
注意:不允许改变队列元素的先后顺序 且 不要求最高同学左右人数必须相等

找到每个位置的向左递减子序列和向右递减子序列
186 186 150 200 160 130 197 200

向左递减子序列

  • 186 左边没有,算上它自己 1

  • 186 左边只有186,因此也只算它自己 1

  • 150 左边没有比他小的 1

  • 200 递减子序列 由于 右边有三个数 150,186,186 这三个最长的递减子序列 为 1,因此 200 的递减子序列为 1 + 1 = 2

  • 160,只比150大,因此它的最长递减子序列 为 150的 + 1 也为 2

  • 130 右边没有比它小的,因此为 1

  • 197 右边比它小的最长子序列为2,因此 为 3

  • 200 显然为 4

186186150200160130197200
11122134

向右递减子序列

  • 200 右边没有 1
  • 197 右边没有比它小的 1
  • 130 同理 1
  • 160 2
  • 200 3
  • 150 2
  • 186 3
  • 186 3

186186150200160130197200
33232111

由于计算递减子序列的时候对拐点处多加一,所以合唱队列为 左子序列 + 右子序列 - 1

186186150200160130197200
向左递减子序列11122134
向右递减子序列33232111
合唱队列33243134
package com.wy.leetcode;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author HelloWorld
 * @create 2022/4/20 08:00
 * @email helloworld.dng@gmail.com
 */
public class ChorusSort {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 获取输入的数组长度
        int n = scanner.nextInt();
        ArrayList<Integer> list = new ArrayList<>();
        int i = n;
        while (i-- > 0) {
            list.add(scanner.nextInt());
        }

        System.out.println(doChorusSort(list, n));

    }

    /**
     * @param list int 集合
     * @param n    集合的长度
     * @return int
     * @description 合唱队
     * @author HelloWorld
     * @create 2022/4/22 19:11
     */
    public static int doChorusSort(List<Integer> list, int n) {
        /* 找到每一个位置的向左递减子序列和向右递减子序列的长度*/

        HashSet<Integer> results = new HashSet<>();

        List<Node> leftNodes = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int currentPosition = i;
            Integer currentSize = list.get(i);

            Node node = new Node(currentSize, currentPosition);
            leftNodes.add(node);
            Integer length = null;
            //  当前节点左递减子序列 为它右边值比它小的节点中 最长的节点长度 + 1
            try {
                length = leftNodes.stream()
                        .filter(node1 -> node1.getSize() < currentSize && node1.getPosition() < currentPosition)
                        .max(Comparator.comparing(Node::getLength))
                        .get()
                        .getLength();
            } catch (Exception e) {
                length = 0;
            }
            leftNodes.get(i).setLength(length + 1);
        }
        List<Node> rightNodes = new ArrayList<>();
        for (int i = n - 1; i >= 0 ; i--) {
            int currentPosition = i;
            Integer currentSize = list.get(i);

            Node node = new Node(currentSize, currentPosition);
            rightNodes.add(node);

            Integer length;
            try {
                length = rightNodes.stream()
                        .filter(node1 -> node1.getSize() < currentSize && node1.getPosition() > currentPosition)
                        .max(Comparator.comparing(Node::getLength))
                        .get()
                        .getLength();
            } catch (Exception e) {
                length = 0;
            }

            rightNodes.get(n - 1 -i).setLength(length + 1);
            results.add(leftNodes.get(i).getLength() + rightNodes.get(n - i -1).getLength() - 1);
        }
        
        // 减去最长队列长度得到就是最少出队人数
        return n - results.stream().max(Comparator.comparing(Integer::intValue)).get();

    }

}

class Node {
    private int size;
    private int position;
    private int length;

    public Node(Integer size, Integer position) {
        this.size = size;
        this.position = position;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

    public Integer getPosition() {
        return position;
    }

    public void setPosition(Integer position) {
        this.position = position;
    }

    public Integer getLength() {
        return length;
    }

    public void setLength(Integer length) {
        this.length = length;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 11:02:21  更:2022-04-23 11:02:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:50:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码