算法训练营day31 | {452.用最少数量的箭引爆气球, 435.无重叠区间, 763.划分字母区间}

第八章贪心算法part04,都是重叠区间问题。

452. 用最少数量的箭引爆气球

1.1 解题分析

难点在于如何模拟气球被射爆的过程,例如如何判断两个气球重叠,如何判断下一个气球也重叠?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int findMinArrowShots(int[][] points) {
if (points.length == 0) return 0;
Arrays.sort(points, (o1, o2)->Integer.compare(o1[0], o2[0]));
int result = 1;
for (int i = 1; i < points.length; i++) {
if (points[i][0] > points[i - 1][1]) result++;
else {
points[i][1] = Math.min(points[i][1], points[i - 1][1]);
}
}
return result;
}
}
  • Java Comparator 写法要注意 int溢出问题,Integer.compare(a, b)是正确的写法,因为它的实现逻辑等价于:
    1
    2
    3
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;

不做减法,永不溢出,关于排序推荐使用Integer.compare(a, b)Long.compare(a, b)

435. 无重叠区间

2.1 解题分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length == 1) return 0;
Arrays.sort(intervals, (o1, o2)->Integer.compare(o1[0], o2[0]));
int result = 0;
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < intervals[i - 1][1]) {
result++;
intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);
}
}
return result;
}
}

763. 划分字母区间

3.1 解题分析

题目要求同一个字母最多出现在一个片段中,怎么能把同一个字母圈在同一个区间中呢?需要记录每一个字母的最远位置。

具体地,解题思路分为两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。

统计字母最远出现的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public List<Integer> partitionLabels(String s) {
int[] hash = new int[26];
List<Integer> result = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
hash[s.charAt(i) - 'a'] = i;
}
int left = 0;
int right = 0;
for (int i = 0; i < s.length(); i++) {
right = Math.max(right, hash[s.charAt(i) - 'a']);
if (i == right) {
result.add(right - left + 1);
left = i + 1;
}
}
return result;
}
}

算法训练营day31 | {452.用最少数量的箭引爆气球, 435.无重叠区间, 763.划分字母区间}
http://paopaotangzu.xyz/cn/day31_leetcode/
作者
PROTON TANG
发布于
2026年1月17日
许可协议