452. 用最少数量的箭引爆气球
精髓:
在判断有没有第三个或更多气球重叠时,更新右边界(取最小的右边界)

注意:右边界和左边界相等(相邻)也能一次射爆。
class Solution {
public int findMinArrowShots(int[][] points) {
// 1 <= points.length <= 10^5
int n = points.length;
int result = 1;
Arrays.sort(points, Comparator.comparingInt(a -> a[0])); // 先排序!按左边界升序排序
for (int i = 1; i < n; 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;
}
}
435. 无重叠区间
和上一题很像
区别:
- 相邻时结果不一样
- 一个是算有多少个不重叠的区间,一个是算有多少个重叠的区间
- result 初始化值不一样,一个为 1,一个为 0
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
// 1 <= intervals.length <= 10^5
int n = intervals.length;
int result = 0;
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
for (int i = 1; i < n; i++) {
if (intervals[i][0] < intervals[i - 1][1]) {
result++;
intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]);
}
}
return result;
}
}
763. 划分字母区间
记录每个元素最后出现的位置。从左往右遍历,遇到更远的位置就更新,当遍历到最远位置时,就划分出了一个区间。
class Solution {
public List<Integer> partitionLabels(String s) {
int n = s.length();
int[] hash = new int[27]; // 字母表,统计字母出现的最远位置
for (int i = 0; i < n; i++) {
hash[s.charAt(i) - 'a'] = i;
}
List<Integer> result = new ArrayList<>();
int left = 0;
int right = 0;
for (int i = 0; i < n; i++) {
right = Math.max(right, hash[s.charAt(i) - 'a']);
if (right == i) { // 到达了最远处
result.add(right - left + 1);
left = i + 1; // 只用更新 left,不用另外更新 right,right 在下次循环更新
}
}
return result;
}
}
382

被折叠的 条评论
为什么被折叠?



