435.无重叠区间
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
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],intervals[i-1][1]);
continue;
}else{
count++;
}
}
//总区间数 - 移除后的区间数 = 需要移除的数量
return intervals.length - count;
}
}
763.划分字母区间
输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中
可以分为如下两步:
- 统计每一个字符最后出现的位置
- 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> list = new LinkedList<>();
int[] edge = new int[26];
//s转换成数组才能根据下标查找
char[] chars = s.toCharArray();
//每个字母在s中对应的最远下标
for (int i = 0; i < chars.length; i++) {
edge[chars[i] - 'a'] = i;
}
int index = 0;//别忘了初始化
int last = -1;
for (int i = 0; i < chars.length; i++){
index = Math.max(index,edge[chars[i] - 'a']);
//最远下标和i重合->分割点
if(index == i){
list.add(i - last);
last = i;
}
}
return list;
}
}