Acwing算法心得——猜测短跑队员的速度(重写比较器)

2023-09-16 19:24:51

大家好,我是晴天学长,今天的算法题用到了比较器的知识,是经常会用到的一个知识点,常见与同种数据的排序,需要的小伙伴请自取哦!如果觉得写的不错的话,可以点个关注哦,后续会继续更新的。💪💪💪


1 )猜测短跑队员的速度

在这里插入图片描述
一个短跑运动员在一个数轴上跑步。 他的奔跑速度是恒定的,但是奔跑方向可能会不断发生改变,有时朝数轴正方向,有时朝数轴负方向。 给定 N 个不同时刻下他所在的位置,请你计算他的速度至少是多少。

输入格式
第一行包含整数 N。

接下来 N 行,每行包含两个整数 T 和 X,表示时刻 T 时,运动员位于位置 X。

注意,输入时刻两两不同,但是不一定按时间顺序给出。

输出格式
一个实数,表示运动员的最小可能速度。

输出结果与标准答案的相对误差小于 10−5 即视为正确。
数据范围
2≤N≤105, 0≤T≤109, −109≤X≤109
输入样例1:
3 0 100 20 50 10 120
输出样例1:
7.0
样例1解释
运动员时刻 0 在位置 100,10 秒后,他位于位置 120,由此可知,他的速度一定不低于 (120−100)/10=2,又过了 10 秒,他位于位置 50,由此可知,它的速度一定不低于 (120−50)/10=7。

输入样例2:
5 20 -5 0 -17 10 31 5 -3 30 11
输出样例2:
6.8


2) .算法思路

答案中的代码是这样的,假设需要排序的数组intervals:

int[][] intervals = {{2,3},{2,9},{4,5},{3,7},{6,7},{8,9},{1,10}};
Arrays.sort(intervals, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        if(o1[0]==o2[0]){
            return o1[1] - o2[1];
        }
        return o1[0] - o2[0];
    }
});

此代码中,对于每个o1和o2数组,若各自第一个元素(也就是o1[0]和o2[0])相等,则按照各自第二个元素进行升序比较,否则就按照第一个元素进行升序比较。

在此,o1[0] - o2[0] 表示升序,o2[0] - o1[0] 表示降序。

比如这个代码,结果如下:

1 10
2 3
2 9
3 7
4 5
6 7
8 9
o1[0]表示第一个元素,以此类推,所以我们想要根据第几个元素排序,就写入就好:

// 按照第三个元素排序
int[][] intervals = {{2,3,4,5},{2,9,7,5},{4,5,1,5},{3,7,1,2},{6,7,3,4}};
Arrays.sort(intervals, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[2] - o2[2];
    }
});

得到的结果如下:

4 5 1 5
3 7 1 2
6 7 3 4
2 3 4 5
2 9 7 5
另外,他还有其他的写法:

  • 使用Lambda表达式的方式对Comparator比较器进行简写(JDK1.8+)
int[][] intervals = {{2,3,4,5},{2,9,7,3},{4,5,1,5},{3,7,1,2},{6,7,3,4}};
Arrays.sort(intervals, (o1, o2) -> {
    return o1[2] - o2[2];
});

3). 算法步骤

1.导入需要使用的类:Arrays、Comparator和Scanner。
2.创建一个Main类,作为程序的入口点。
3.创建一个Scanner对象,用于读取输入。
4.从输入中读取一个整数N,表示搜索数据的数量。
5.创建一个二维数组search,大小为N×2,用于存储搜索数据。
6.使用循环,读取N个搜索数据,并将它们存储在search数组中。
7.使用Arrays.sort方法对search数组进行排序,根据每个搜索数据的第一个元素进行升序排序。
8.通过创建一个Comparator对象,重写compare方法,指定按照第一个元素的升序排序。
9.或者使用lambda表达式 (o1, o2) -> (o1[0] - o2[0]) 作为排序的比较函数。
10.初始化一个变量min为0,用于存储最大搜索斜率的初始值。
11.使用循环,从数组的第二个元素开始,遍历所有搜索数据。
12.计算两个搜索数据之间的斜率,即当前搜索数据的纵坐标与前一个搜索数据的纵坐标之差除以横坐标的差值。
13.更新min的值,取当前斜率与min的较大值。
14使用System.out.format方法,以保留一位小数的格式输出min的值。
15.程序执行完毕。


4).代码示例

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

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int [][] search =  new int[N][2];
        for (int i = 0; i < N; i++) {
            search[i][0] = scanner.nextInt();
            search[i][1] = scanner.nextInt();
        }
        //重写排序
//        Arrays.sort(search, (o1, o2) -> (o1[0] - o2[0]));
        Arrays.sort(search,new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
               return o1[0] - o2[0];
            }
        });
            double min = 0;
            for (int i = 1; i < N; i++) {
                double x = Math.abs(search[i][1] - search[i-1][1]);
                double t = search[i][0] - search[i - 1][0];
                min = Math.max(min, x / t);
            }
        System.out.format("%.1f", min);
    }
}


5).总结

  • 排序的重写器。

试题链接:

更多推荐

【JavaSE专栏51】Java集合类HashSet解析,基于哈希表无序非重元素集合

作者主页:Designer小郑作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。主打方向:Vue、SpringBoot、微信小程序本文讲解了Java中集合类HashSet的语法、使用说明和应用场景,并给出了样例代码。目录一、什么是HashSe

【Linux】进程间通信

目录一、进程间通信的目的二、管道通信1.匿名管道2.命名管道①.创建命名管道②.使用命名管道三、systemV标准进程间通信1.共享内存①常用接口②共享内存的内核数据结构③查看删除共享内存一、进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另

【EI检索会议】第四届智能电网与能源工程国际研讨会(SGEE 2023)

第四届智能电网与能源工程国际研讨会(SGEE2023)20234thInternationalConferenceonSmartGridandEnergyEngineering继往届SGEE年度系列会议的成功举办,所录用论文已完成出版及检索。第四届智能电网与能源工程国际研讨会将于2023年11月24日-26日在河南郑州

如何构建一个 NodeJS 影院微服务并使用 Docker 部署

文章目录前言什么是微服务?构建电影目录微服务构建微服务从NodeJS连接到MongoDB数据库总结前言如何构建一个NodeJS影院微服务并使用Docker部署。在这个系列中,将构建一个NodeJS微服务,并使用DockerSwarm集群进行部署。以下是将要使用的工具:NodeJS版本7.2.0MongoDB3.4.1D

ChatGPT:字符串操作问题——提取包含括号的字符串中的题干内容

ChatGPT:字符串操作问题——提取包含括号的字符串中的题干内容Stringtitle=p.text().split(“(”)[0];为什么会报错ChatGPT:在这段代码中,您正在使用Java处理一个字符串(假设是HTML或文本),尝试将其分割成两部分,其中一个是从左括号"("之前的内容。这段代码的目的是提取标题,

消息队列(三):硬盘管理

我在第一章提到过:关于持久化那一块,在内存存储主要是获取比较方便,在硬盘上存储主要是为了长时间存储。关于内存管理又分两部分:数据库管理和文件管理(主要是和消息有关)。硬盘管理硬盘中的数据库管理其实在上一章的建库建表说过了,就这么几步,SQLite+MyBatis几十行代码就搞定了除此之外就是对其进行一个封装即可。这里的

K8S名称空间和资源配额

Kubernetes支持多个虚拟集群,底层依赖于同一个物理集群。这些虚拟集群被称为名称空间。名称空间namespace是k8s集群级别的资源,可以给不同的用户、租户、环境或项目创建对应的名称空间,例如,可以为test、dev、prod环境分别创建各自的命名空间。当多个用户或团队共享具有固定节点数目的集群时,人们会担心有

5.k8s jenkins集成k8s一键发布案例

文章目录前言一、jenkins配置1.1jenkins配置git1.2jenkins配置maven1.3jenkins配置java二、jenkins流水线配置2.1.新增项目2.2springboot项目配置git仓库2.3springboot项目配置maven打包2.4系统配置ssh到hadoop1配置,也就是k8s

MYSQL01高级_Linux版安装、各级别字符集、字符集与比较规则、SQL大小写规范

文章目录①.MySQL-linux版安装②.字符集的相关操作③.各级别的字符集④.字符集与比较规则(了解)⑤.SQL大小写规范⑥.sql_mode的合理设置①.MySQL-linux版安装①.进入mysql官网,找到安装文件②.将抽取出来的文件放在linux下的opt下MySQLCommunityServer社区版本,

创邻科技,位居IDC MarketScape中国图数据库市场领导者类别

图数据库,正进入市场发展的新阶段。随着中国经济社会数字化转型加速,数据成为新型生产要素。如何存储并管理海量数据,挖掘数据价值,打破原有增长天花板,成为企业重塑商业价值的关键。存量经济时代更需要深层关系挖掘,打造更深刻的客户洞察和画像,从点、面、网来做网络分析。作为数字化企业构建相对竞争优势的关键技术,图数据库正大步迈进

企业级通用低代码开发平台——一二三应用开发平台发布4.2开源版本,回顾与展望

背景今年三月初,确定了自己将来很长一段时间要做的事情,再启程,从头开始,研发一套应用开发平台,完全开源,详见https://blog.csdn.net/seawaving/article/details/129334330。从头开始,不是从零开始,大量的技术选型工作,平台设计与实现工作,都已实现,需要的大多是迁移和优化

热文推荐