class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//转化为找无重叠区间个数的问题
//按右边界排序
Arrays.sort(intervals, (o1, o2) -> {
if (o1[1] == o2[1]) return Integer.compare(o2[0], o1[0]);
return Integer.compare(o1[1], o2[1]);
});
//从左到右遍历找需要移除的区间
int preEnd = intervals[0][1], n = 0;
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] >= preEnd) {
preEnd = intervals[i][1];
} else {
n++;
}
}
return n;
}
}
![]()
class Solution {
public List<Integer> partitionLabels(String s) {
//遍历第一次 找出每个字母的最后一次出现的下标
int[] lastAppear = new int[26];
char[] array = s.toCharArray();
for (int i = 0; i < array.length; i++) {
lastAppear[array[i] - 'a'] = i;
}
//分割 根据该段中已有字母的最大右边界
List<Integer> res = new ArrayList<>();
int curIndexMax = -1, count = 0;
for (int i = 0; i < array.length; i++) {
curIndexMax = Math.max(curIndexMax, lastAppear[array[i] - 'a']);
count++;
if (i == curIndexMax) {
res.add(count);
count = 0;
}
}
return res;
}
}
![]()
参考:programmercarl.com