435. 无重叠区间
- 学习文章链接:
- 思路:
- 求重复区间:本人采用的是右边界排序
- 求非重复区间:改编自射气球
- 代码:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
// 难点一:一看题就有感觉需要排序,但究竟怎么排序,按左边界排还是右边界排。
// 难点二:排完序之后如何遍历,如果没有分析好遍历顺序,那么排序就没有意义了。
// 难点三:直接求重复的区间是复杂的,转而求最大非重复区间个数。
// 难点四:求最大非重复区间个数时,需要一个分割点来做标记。
// 452. 用最少数量的箭引爆气球改编
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
int count = 1;
for (int i = 1; i < intervals.length; i++) {
// 加等号。
if (intervals[i][0] >= intervals[i - 1][1]) {
count++;
} else {
// 这里取最小才会合并区间,例如三段首尾相交.
intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);
}
}
// 统计出非重合区间。
return intervals.length - count;
}
}
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
// 难点一:一看题就有感觉需要排序,但究竟怎么排序,按左边界排还是右边界排。
// 难点二:排完序之后如何遍历,如果没有分析好遍历顺序,那么排序就没有意义了。
// 难点三:直接求重复的区间是复杂的,转而求最大非重复区间个数。
// 难点四:求最大非重复区间个数时,需要一个分割点来做标记。
Arrays.sort(intervals, (a, b) -> Integer.compare(a[1], b[1]));
int remove = 0;
int edge = Integer.MIN_VALUE;
for (int i = 0; i < intervals.length; i++) {
if (edge <= intervals[i][0]) {
edge = intervals[i][1];
} else {
remove++;
}
}
return remove;
}
}
763.划分字母区间
- 学习文章链接:
- 思路:
- 代码:
-
class Solution {
public List partitionLabels(String s) {
// 1. 统计每一个字符最后出现的位置
// edge为记录字符位置信息的数组。
int[] edge = new int[26];
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
edge[c[i] - ‘a’] = i;
}
LinkedList list = new LinkedList<>();
// 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
int idx = 0;
// 边界值last为-1是因为求长度,所以初始值为-1.
int last = -1;
for (int i = 0; i < c.length; i++) {
idx = Math.max(idx, edge[c[i] - ‘a’]);
if (idx == i) {
list.add(i - last);
last = idx;
}
}
return list;
}
}
# 56.合并区间
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
// 创建结果集
List<int[]> res = new LinkedList<>();
// 初始化左右边界
int left = intervals[0][0];
int rigth = intervals[0][1];
// 遍历区间:不重合则加入到结果集中,重合则合并区间。
for (int i = 1; i < intervals.length; i++) {
if (left < intervals[i][0]) {
res.add(new int[]{left, rigth});
left = intervals[i][0];
rigth = intervals[i][1];
} else {
rigth = Math.max(rigth ,intervals[i][1]) ;
}
}
// 不要忘记将最后一个区间加进去
res.add(new int[]{left, rigth});
return res.toArray(new int[res.size()][]);
}
}