435. 无重叠区间
这题和气球那题有点像。弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> {
return 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]){
intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1]);
continue;
} else{
count ++;
}
}
return intervals.length - count;
}
}
763. 划分字母区间
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> list = new LinkedList<>();
int[] edge = new int[26];
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length; i ++){
edge[chars[i] - 'a'] = i;
}
int idx = 0;
int last = -1;
for(int i = 0; i < chars.length; i ++){
idx = Math.max(idx, edge[chars[i] - 'a']);
if(i == idx){
list.add(i - last);
last = i;
}
}
return list;
}
}
56. 合并区间
这题也是判断区间重叠,判断区间重叠后要进行区间合并。判断的方法是对数组进行排序然后寻找边界,合并的过程就是找出区间的左边界和右边界,这样形成一个新区间然后就可以加入到result数组里了。
class Solution {
public int[][] merge(int[][] intervals) {
LinkedList<int[]> res = new LinkedList<>();
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
res.add(intervals[0]);
for(int i = 1; i < intervals.length; i ++){
if(intervals[i][0] <= res.getLast()[1]){
int start = res.getLast()[0];
int end = Math.max(intervals[i][1], res.getLast()[1]);
res.removeLast();
res.add(new int[]{start, end});
} else{
res.add(intervals[i]);
}
}
return res.toArray(new int[res.size()][]);
}
}