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

一、题目描述

示例:

输入:

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[]>{@Overridepublic 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[]>() {@Overridepublic 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.hqwc.cn/news/195541.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

股东入股可用的出资形式主要有哪些

股东入股&#xff0c;可用的出资形式主要包括货币以及实物、知识产权、土地使用权等可以用货币估价并可以依法转让的非货币财产。 第一&#xff0c;货币。设立公司必然需要一定数量的流动资金。以支付创建公司时的开支和启动公司运营。因此&#xff0c;股东可以用货币出资。 第…

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

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

Linux|僵死进程

1.僵死进程产生的原因或者条件: 什么是僵死进程? 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取…

Activiti7工作流

文章目录 一、工作流介绍1.1 概念1.2 适用行业1.3 应用领域1.4 传统实现方式1.5 什么是工作流引擎 二、什么是Activiti7&#xff1f;2.1 概述2.2 Activiti7内部核心机制2.3 BPMN2.4 Activiti如何使用2.4.1 整合Activiti2.4.2 业务流程建模2.4.3 部署业务流程2.4.4 启动流程实例…

【Java 进阶篇】JQuery 事件绑定:`on` 与 `off` 的奇妙舞曲

在前端开发的舞台上&#xff0c;用户与页面的互动是一场精彩的表演。而 JQuery&#xff0c;作为 JavaScript 的一种封装库&#xff0c;为这场表演提供了更为便捷和优雅的事件绑定方式。其中&#xff0c;on 和 off 两位主角&#xff0c;正是这场奇妙舞曲中的核心演员。在这篇博客…

【C语言.oj刷题】有序#整型矩阵元素查找##{思路+C源码}

目录 题目信息 题目分析&#xff1a; 法一&#xff1a; 遍历二维数组&#xff08;低效&#xff09; 思路 源码 局限性 法二&#xff1a; 对每一行二分查找&#xff08;有所提效&#xff09; 思路 源码 局限性 法三&#xff1a; 利用一切有利条件使用二分查找 思路 …

线性表--链表-1

文章目录 主要内容一.链表练习题1.设计一个递归算法&#xff0c;删除不带头结点的单链表 L 中所有值为 X 的结点代码如下&#xff08;示例&#xff09;: 2.设 L为带头结点的单链表&#xff0c;编写算法实现从尾到头反向输出每个结点的值代码如下&#xff08;示例&#xff09;: …

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

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

Linux应用开发基础知识——输入系统应用编程(八)

前言&#xff1a; 触摸屏分为电阻屏、电容屏。电阻屏结构简单&#xff0c;在以前很流行&#xff1b;电容屏支持多点触摸&#xff0c;现在的手机基本都是使用电容屏。我们应当注意的是LCD、触摸屏不是一回事&#xff0c;LCD 是输出设备&#xff0c;触摸屏是输入设备。制作触摸屏…

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

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

入股合作协议要不要写章程

公司章程&#xff0c;是注册公司的基本文件&#xff0c;也公司必备的规定公司组织及活动基本规则的书面文件&#xff0c;是公司成立的必不可少的基础&#xff0c;也是公司赖以生存的灵魂。那么&#xff0c;这次要和大家讨论的是有关于入股合作协议要不要写章程的问题了。 入股合…

Spring cloud - Hystrix服务限流、熔断及降级

Hystrix的作用 Hystrix的主要作用是在微服务环境下防止服务雪崩&#xff0c;确保服务弹性及可用性。 具体来说&#xff0c;Hystrix可以实现&#xff1a; 服务降级&#xff1a;通过fallback实现服务不可达情况下的服务降级作用。熔断&#xff1a;服务不可达的情况下在设定时间…