Comparator之用最少数量的箭引爆气球
文章目录
前言
今天刷个题,遇到一个很有趣的问题,关于Comparator的使用,感觉也是一个关于写代码的一些小细节的问题
关于Comparator
Comparator是java8新增的一个比较器,相信大家如果使用过Arrays和Collections的排序方法时,应该对这个都不陌生,不知道大家都是怎么写比较器内部的代码
这种写法应该也是大家会用的方法。
// 1. 第一种写法
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o1[0] - o2[0];
} else {
return o1[1] - o2[1];
}
}
});
第二种写法,这种是调用compareTo方法,这种方法是用来比较Integer, Long, Short, Double,Byte类型
```java
// 1. 第一种写法
Arrays.sort(points, new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
第三种写法,这种写法应该是非常常见的写法了。
```java
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] < o2[0]) {
return -1;
} else if (o1[0] > o2[0]) {
return 1;
} else {
return 0;
}
}
});
原题
细心的同学就会发现了,第一种写法是有一定问题的,第二种方法的话有一定的局限性,为什么我会这么说呢,先看一道题吧LeetCode452:用最小数量的箭引爆气球这道题。
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,
其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知
道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出
一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足
xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。
弓箭一旦被射出之后,可以无限地前进。给你一个数组 points ,返回引爆所有气球所必须
射出的 最小 弓箭数 。
这道题的思路也不是很难,我们可以先对气球的start进行一个排序,然后关于气球的重叠我们可以分为两种情况,主要分为不重叠的情况和重叠的情况,重叠的情况以两个重叠的右边界的最小值来充当边界,然后遍历就可以成功。
下面来看我第一次提交的代码
class Solution {
public int findMinArrowShots(int[][] points) {
int n = points.length;
if (n == 0) {
return 0;
}
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o1[0] - o2[0];
} else {
return o1[1] - o2[1];
}
}
});
int ans = 1;
// 如果两个气球都有重叠,取两个重叠的最小值,如果两个没有重叠,直接加1
for (int i = 1; i < n; i++) {
if (points[i][0] > points[i-1][1]) {
ans ++;
} else {
// have overlap min right side
points[i][1] = Math.min(points[i][1], points[i-1][1]);
}
}
return ans;
}
}
好像这样看来是没有什么问题的,但是提交呢,竟然不通过,然后看一下最后执行的输入
[[-2147483646,-2147483645],[2147483646,2147483647]]
我们定位一下错误,o1[0] - o2[0]这里是不是已经越界了呢,事实是确实已经越界了,具体的结果留给大家去试了。
我们采用第三种比较方法提交
class Solution {
public int findMinArrowShots(int[][] points) {
int n = points.length;
if (n == 0) {
return 0;
}
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if (o1[0] < o2[0]) {
return -1;
} else if (o1[0] > o2[0]) {
return 1;
} else {
return 0;
}
}
});
int ans = 1;
// 如果两个气球都有重叠,取两个重叠的最小值,如果两个没有重叠,直接加1
for (int i = 1; i < n; i++) {
if (points[i][0] > points[i-1][1]) {
ans++;
} else {
// have overlap min right side
points[i][1] = Math.min(points[i][1], points[i-1][1]);
}
}
return ans;
}
}
当然最后是A了,不过这个越界还卡了我好久,没有注意到越界问题…
Comparator之用最少数量的箭引爆气球的更多相关文章
- Leetcode 452.用最少数量的箭引爆气球
用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了.开始坐 ...
- Java实现 LeetCode 452 用最少数量的箭引爆气球
452. 用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够 ...
- 【LeetCode贪心#09】用最少数量的箭引爆气球(涉及区间重叠情况判断)
用最少数量的箭引爆气球 力扣题目链接(opens new window) 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重 ...
- [LeetCode] Minimum Number of Arrows to Burst Balloons 最少数量的箭引爆气球
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- [Swift]LeetCode452. 用最少数量的箭引爆气球 | Minimum Number of Arrows to Burst Balloons
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- 452 Minimum Number of Arrows to Burst Balloons 用最少数量的箭引爆气球
在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了.开始坐标总是小于结束坐标.平面 ...
- LeetCode:用最少的箭引爆气球【452】
LeetCode:用最少的箭引爆气球[452] 题目描述 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道 ...
- 练习1-21:编写程序entab,将空格串替换为最少数量的制表符和空格。。。(C程序设计语言 第2版)
#include <stdio.h> #define N 5 main() { int i, j, c, lastc; lastc = 'a'; i = j = ; while ((c=g ...
- Leetcode 12,452,455-贪心算法
Leetcode第12题,整数转罗马数字,难度中等 整个题目比较好理解,难度也不大,就算不过脑子,用一串if也基本上可以解决问题,比如 /** 执行用时:6ms,在所有 Java 提交中击败了52.6 ...
- Leedcode算法专题训练(贪心)
1. 分配饼干 455. 分发饼干 题目描述:每个孩子都有一个满足度 grid,每个饼干都有一个大小 size,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足.求解最多可以获得满足的孩子数 ...
随机推荐
- ZooKeeper启动报错,未成功开启服务
1.问题示例 (1)启动ZooKeeper服务报错 [Hadoop@master ~]$ zkServer.sh statusZooKeeper JMX enabled by defaultUsing ...
- 解决idea翻译失败问题
修改host(windows)(2022-11-09) 进入该目录,C:\Windows\System32\drivers\etc,hosts文件上右键,把hosts文件的只读去了 打开hosts文件 ...
- Pytorch-UNet-master>utils>data_loading.py
模块,包 在package_runoob同级目录下,用test.py调用package_runoob包中内容 参考链接: Python 模块 | 菜鸟教程 (runoob.com) Dataset ...
- QImageReader(Writer)支持格式变少的解决方法
首发于我的个人博客:xie-kang.com 博客内有更多文章,欢迎大家访问 原文地址 获取程序支持的图片格式: #include "mainwindow.h" #include ...
- linux使用iperf3测试带宽
1. https://www.alibabacloud.com/help/zh/express-connect/latest/test-the-performance-of-an-express-co ...
- 给jui(dwz)的navTab换一套漂亮的图标
上次讲了给jui(dwz)的菜单树换一套漂亮的图标,这次讲一下在点击菜单后,怎么把设置的漂亮图标带到navTab上去. 官方的navTab是这样显示的,除了默认的我的主页外,tab页上只有标题没有图标 ...
- Java笔记第十弹
网络编程三要素 1.IP地址--设备的标识 2.端口--应用程序的标识 3.协议--常见的协议有UDP协议和TCP协议 IP地址 1.IPv4(二进制数据) 2.IPv6 常用命令: ipconfig ...
- 关于Android开发工具的下载之SDK篇
SDK的下载 需要注意的是,如果我们使用的是Eciplise工具的话,那我们需要下载版本较低的android SDK tools, 在这里把下载链接放在这里啦:https://link.csdn.ne ...
- python创建线程传参误区记录
创建线程可以使用threading模块中的Thread子类: 其中Thread子类允许的参数如下: (self, group=None, target=None, name=None, args=() ...
- 当我把ChatGPT拉进群聊里,我的朋友都玩疯了
前言 近期ChatGPT可以说是太火了,问答.写论文.写诗.写代码,只要输入精确的prompt,他的表现总是让人惊喜.本着打不过就加入的原则.要是把ChatGPT拉入群聊中,会是怎样一番场景?说做就做 ...