class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b) -> {return Integer.compare(a[0], b[0]);});//左边界排序
// int pre = intervals[0][1];
// int remove = 0;
int count = 1;//无交叉区间第一个区间为1
for(int i = 1; i < intervals.length; i++) {
// if(intervals[i][0] < pre) {
// remove++;//遇到重叠就移除 之后更新区域范围
// pre = Math.min(pre, intervals[i][1]);
// } else {
// pre = intervals[i][1];
// }
if(intervals[i][0] < intervals[i-1][1]) {
intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]);//交叉更新最小边界
continue;
} else {
count++;//不交叉数量加一
}
}
//return remove;
return intervals.length - count;//总数减去无交叉区间个数
}
}
?
没做出来 第一步寻求字母的末尾位置都想不到 根据最终位置找最大区间思路想不到
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> res = new ArrayList<>();
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) {//若到达最终位置 记录区间大小 并更新区间边界
res.add(i - last);
last = i;
}
}
return res;
}
}
注意最后一个区间要另加
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new LinkedList<>();
Arrays.sort(intervals, (a,b) -> Integer.compare(a[0], b[0]));//左边界排序
int start = intervals[0][0];
int right = intervals[0][1];
for(int i = 1; i < intervals.length; i++) {
if(intervals[i][0] <= right) {//重叠
right = Math.max(right, intervals[i][1]);//更新右边界
} else {//不重叠
res.add(new int[]{start, right});//添加上一个重叠区间
start = intervals[i][0];//重新定义新边界
right = intervals[i][1];
}
}
res.add(new int[]{start,right});//加上最后区间
return res.toArray(new int[res.size()][]);
}
}
?