阿坤老师的独特瓷器(Java详解)

news2024/9/25 5:21:43

一、题目描述

示例:

输入:

5

3 4

5 6

2 5

3 7

6 5

 输出:

3

二、题解

思路分析:

题目要求我们计算出“独特瓷器”的个数,而“独特瓷器”是指对于瓷器A,没有另一个瓷器B,直径和高度都大于A。则当有瓷器的直径和高度都大于A时,A不为“独特瓷器”。因此,最简单的方法是通过循环来遍历这N个瓷器,分别判断其是否为“独特瓷器”。然而,由于其使用了双重for循环,会导致部分测试用例运行超时,而导致测试失败

由于只有当瓷器B的直径和高度都大于A时,A才不能为“独特瓷器”,因此我们可以先按照瓷器的直径d(或是高度h)按照从大到小的规则来对这些瓷器按进行排序,这样,瓷器A前面的所有瓷器直径d都大于或等于瓷器A的直径,而当直径d相同时,我们则按照高度h从小到大排序

为什么要这样排序?

当我们将瓷器以d从大到小进行排序,则表明瓷器A前面的所有瓷器的直径d都大于或等于A的直径d,此时,我们只需要判断瓷器的高度h,假设瓷器A前面的所有瓷器直径d都大于A的d(等于的情况后面会讨论),则瓷器A前面有一个瓷器的h大于A的h,则表明A不是“独特瓷器”,此时我们只需以前面瓷器h的最大值来和A的h进行比较,就可以判断出A是否是“独特瓷器”

为什么当d相同时要以h进行从小到大排序?

当d相同时,若将h更大的瓷器B排在A前面,则瓷器高度的最大值max必定大于A,A被判断为不是“独特瓷器”,然而,A的d与B的d相同,不满足B的d和h都大于A,因此,A是“独特瓷器”。所以,当d相同时,我们要将h较小的瓷器A排在前面,先判断A是否为“独特瓷器”,再判断h较大的瓷器B是否为独特瓷器。

实现步骤:

1. 将这n个瓷器的直径d和高h存放到二维数组中

2. 将瓷器以d按从大到小进行排序,当d相同时,以h从小到大进行排序

如何实现二维数组的排序?

我们可以使用Arrays.sort()来实现二维数组的排序。由于Arrays.sort()只能对一维数组进行排序,而对于二维数组,则需要使用自定义的Comparator

Comparator是一个专用的比较器,当对象不支撑自比较或是自比较函数不能满足需求时,可以使用比较器来完成两个对象之间大小的比较

如何实现Comparator接口?

我们需要以d降序排序,当d相同时,以h升序排序

(1)自定义类

定义类MyComparator继承于Comparator<>,并重写compare方法

class MyComparator implements Comparator<int[]>{
    @Override
     public int compare(int[] o1, int[] o2) {
        //当直径d相同时,按h升序排序
        if(Integer.compare(o1[0],o2[0]) == 0){
            return Integer.compare(o1[1],o2[1]);
        }else {
            //直径d不同时,以d降序排序
            return Integer.compare(o2[0],o1[0]);
        }
    }
}
Arrays.sort(porcelain,new MyComparator());

(2)匿名内部类

Arrays.sort(porcelain, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        //当直径d相同时,按h升序排序
        if(Integer.compare(o1[0],o2[0]) == 0){
            return Integer.compare(o1[1],o2[1]);
        }else {
            //直径d不同时,以d降序排序
            return Integer.compare(o2[0],o1[0]);
        }
    }
});

(3)lambda表达式

Arrays.sort(porcelain, (o1, o2) -> {
    //当直径d相同时,按h升序排序
    if(Integer.compare(o1[0],o2[0]) == 0){
        return Integer.compare(o1[1],o2[1]);
    }else {
        //直径d不同时,以d降序排序
        return Integer.compare(o2[0],o1[0]);
    }
});

3. 定义瓷器的最大高度maxH=0(瓷器的高度不可能为负数),遍历这N个瓷器,判断其是否为“独特瓷器”,统计“独特瓷器”的个数

代码实现:

import java.util.Arrays;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n = scan.nextInt();
        //将这n个瓷器的直径d和高h存放到二维数组中
        int[][] porcelain = new int[n][2];
        for (int i = 0; i < n; i++) {
            porcelain[i][0] = scan.nextInt();
            porcelain[i][1] = scan.nextInt();
        }

        //排序
        //按照直径d降序排序,若d相同,则按照高度h升序排序
        Arrays.sort(porcelain, (o1, o2) -> {
            //当直径d相同时,按h升序排序
            if(Integer.compare(o1[0],o2[0]) == 0){
                return Integer.compare(o1[1],o2[1]);
            }else {
                //直径d不同时,以d降序排序
                return Integer.compare(o2[0],o1[0]);
            }
        });

        //定义最大高度maxH,遍历这n个瓷器,判断其是否为“独特瓷器”
        int maxH = 0;
        int count = 0;
        for (int i = 0; i < n; i++) {
            if(porcelain[i][1] >= maxH){
                count++;
                maxH = porcelain[i][1];
            }
        }
        //输出独特瓷器的个数
        System.out.println(count);
    }
}

题目来自:

阿坤老师的独特瓷器 - 蓝桥云课 (lanqiao.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1227879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系列三、双亲委派 沙箱安全 机制

一、概述 当一个类收到了类加载的请求&#xff0c;它首先不会尝试自己去加载这个类&#xff0c;而是把这个请求委派给父类去完成&#xff0c;每一层的类加载器都是如此&#xff0c;因此所有的请求最终都应该传送到启动类加载器中&#xff0c;只有当父类加载器反馈自己无法完成…

算法通关村——数字中的统计、溢出、进制转换处理模板

数字与数学基础问题 1、数字统计 1.1、符号统计 LeetCode1822. 给定一个数组&#xff0c;求所有元素的乘积的符号&#xff0c;如果最终答案是负的返回-1&#xff0c;如果最终答案是正的返回1&#xff0c;如果答案是0返回0. 这题其实只用看数组中0和负数的个数就好了&#x…

基于卡尔曼滤波实现行人目标跟踪

目录 1. 作者介绍2. 目标跟踪算法介绍2.1 目标跟踪背景2.2 目标跟踪任务分类2.3 目标跟踪遇到的问题2.4 目标跟踪方法 3. 卡尔曼滤波的目标跟踪算法介绍3.1 所用数据视频说明3.2 卡尔曼滤波3.3 单目标跟踪算法3.3.1 IOU匹配算法3.3.2 卡尔曼滤波的使用方法 3.4 多目标跟踪算法 …

【顺序表的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 数据结构相关概念 1、什么是数据结构 2、为什么需要数据结构&#xff1f; 2、顺序表 1、顺序表的概念及结构 1.1 线性表 2、顺序表分类 3、动态顺序表的实现 总…

高效管理文件:如何通过文件数量归类提高工作效率

在日常生活和工作中&#xff0c;需要处理大量的文件和资料。然而&#xff0c;如果这些文件没有得到妥善的管理&#xff0c;就会使得我们花费大量的时间和精力去寻找和整理它们。对于大量文件&#xff0c;按照数量归类可以使得文件管理更加有序和规范。根据文件的数量建立相应的…

中国电影票房排行数据爬取及分析可视化

大家好&#xff0c;我是带我去滑雪&#xff01; 对中国电影票房排行数据的爬取和分析可视化具有多方面的用处&#xff1a;例如了解电影市场的历史趋势&#xff0c;包括不同类型电影的受欢迎程度、票房的季节性波动。识别观众对于不同类型电影的偏好&#xff0c;为电影制片方提供…

Linux下快速确定目标服务器支持哪些协议和密码套件

实现原理是利用TLS协议的特点和握手过程来进行测试和解析响应来确定目标服务器支持哪些TLS协议和密码套件。 在TLS握手过程中&#xff0c;客户端和服务器会协商并使用相同的TLS协议版本和密码套件来进行通信。通过发送特定的握手请求并分析响应&#xff0c;可以确定目标服务器…

Linux 零拷贝splice函数

Linux splice 函数简介 splice 是 Linux 系统中用于在两个文件描述符之间移动数据的系统调用。它的主要作用是在两个文件描述符之间传输数据&#xff0c;而无需在用户空间进行数据拷贝。也是零拷贝操作. 函数原型 #include <fcntl.h> ssize_t splice(int fd_in, loff_…

git常用命令和参数有哪些?【git看这一篇就够了】

文章目录 前言常用命令有哪些git速查表奉上常用参数后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;git操作相关 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出…

数电实验-----实现74LS139芯片扩展为3-8译码器以及应用(Quartus II )

目录 一、74LS139芯片介绍 芯片管脚 芯片功能表 二、2-4译码器扩展为3-8译码器 1.扩展原理 2.电路图连接 3.仿真结果 三、3-8译码器的应用&#xff08;基于74ls139芯片&#xff09; 1.三变量表决器 2.奇偶校验电路 一、74LS139芯片介绍 74LS139芯片是属于2-4译码器…

设计模式-组合模式-笔记

“数据结构”模式 常常有一些组件在内部具有特定的数据结构&#xff0c;如果让客户程序依赖这些特定数据结构&#xff0c;将极大地破坏组件的复用。这时候&#xff0c;将这些特定数据结构封装在内部&#xff0c;在外部提供统一的接口&#xff0c;来实现与特定数据结构无关的访…

【libGDX】使用ShapeRenderer绘制几何图形

1 ShapeRenderer 简介 ShapeRenderer 是 libGDX 中用于绘制基本形状的工具之一。它可以绘制点、线、矩形、多边形、圆形、椭圆形、扇形、立方体、圆锥体等几何图形。这对于在游戏或图形应用程序中绘制简单的形状是很有用的。 ShapeRenderer 的主要方法如下&#xff1a; 1&…

10_6 input输入子系统,流程解析

简单分层 应用层 内核层 --------------------------- input handler 数据处理层 driver/input/evdev.c1.和用户空间交互,实现fops2.不知道数据怎么得到的,但是可以把数据上传给用户--------------------------- input core层1.维护上面和下面的两个链表2.为上下两层提供接口--…

深度学习:欠拟合与过拟合

1 定义 1.1 模型欠拟合 AI模型的欠拟合&#xff08;Underfitting&#xff09;发生在模型未能充分学习训练数据中的模式和结构时&#xff0c;导致它在训练集和验证集上都表现不佳。欠拟合通常是由于模型太过简单&#xff0c;没有足够的能力捕捉到数据的复杂性和细节。 1.2 模型…

Python 自动化(十七)ORM操作

ORM-查询操作 查询简介 数据库的查询需要使用管理器对象 objects 进行 通过 自定义模型类.objects 管理器调用查询方法 查询方法 all()方法 概念与理解 用法&#xff1a;自定义模型类.objects.all()作用&#xff1a;查询自定义模型实体中所有的数据等同于 select * fr…

第八部分:JSP

目录 JSP概述 8.1&#xff1a;什么是JSP&#xff0c;它有什么作用&#xff1f; 8.2&#xff1a;JSP的本质是什么&#xff1f; 8.3&#xff1a;JSP的三种语法 8.3.1&#xff1a;jsp头部的page指令 8.3.2&#xff1a;jsp中的常用脚本 ①声明脚本&#xff08;极少使用&#xf…

【Python仿真】基于EKF的传感器融合定位

基于EKF的传感器融合定位&#xff08;Python仿真&#xff09; 简述1. 背景介绍1.1. EKF扩展卡尔曼滤波1.1.1.概念1.1.2. 扩展卡尔曼滤波的主要步骤如下&#xff1a;1.1.3. 优、缺点 1.2. 航位推算1.3. 目前航位算法的使用通常与卡尔曼滤波相结合使用2. 分段代码 2.1. 导入需要的…

【Go入门】 Go如何使得Web工作

【Go入门】 Go如何使得Web工作 前面小节介绍了如何通过Go搭建一个Web服务&#xff0c;我们可以看到简单应用一个net/http包就方便的搭建起来了。那么Go在底层到底是怎么做的呢&#xff1f;万变不离其宗&#xff0c;Go的Web服务工作也离不开我们第一小节介绍的Web工作方式。 w…

Java --- JVM之垃圾回收相关算法

目录 一、垃圾标记算法 1.1、垃圾标记阶段&#xff1a;对象存活判断 1.2、引用计数算法 1.3、可达性分析算法 1.4、GC Roots 二、对象的finalization机制 2.1、生存还是死亡&#xff1f; 三、查看GC Roots 3.1、使用MAT查看 四、使用JProfiler分析OOM 五、清除阶段算…

系列五、怎么查看默认的垃圾收集器是哪个?

一、怎么查看默认的垃圾收集器是哪个 java -XX:PrintCommandLineFlags -version