435. 无重叠区间
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//这行代码是对一个二维数组intervals进行排序,
//根据每个子数组的第一个元素进行升序排序。
//Lambda表达式(a,b)-> { return Integer.compare(a[0],b[0]);}
//是用来定义比较规则的,比较的是每个子数组的第一个元素。
//Arrays.sort方法会根据这个比较规则对intervals进行排序。
Arrays.sort(intervals, (a, b) -> {
return Integer.compare(a[0], b[0]);
});
int result = 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{
//当前和上一个没有重叠部分,则无重叠区间+1
result++;
}
}
//返回需要移除区间的最小数量
return intervals.length - result;
}
}
763.划分字母区间
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> result = new LinkedList<>();
//使用类似桶排序的方式,一共有26个英文字母
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 = 0;
for(int i = 0; i < chars.length; i++){
idx = Math.max(idx, edge[chars[i] - 'a']);
//当前位置已经到了更新后的当前区域的最远的位置
if(i == idx){
//说明当前区域遍历已经结束,加入结果集,并更新下一区域的起始
result.add(i - last + 1);
last = i + 1;
}
}
return result;
}
}
56. 合并区间
class Solution {
public int[][] merge(int[][] intervals) {
//定义二维数组做结果存储
List<int[]> result = new LinkedList<>();
//lambda表达式中的比较函数会根据每个区间的第一个元素进行比较
//从而实现对区间数组的按照第一个元素升序排序。
Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));
//初始化最小左边界为start
int start = intervals[0][0];
int mostRightBound = intervals[0][1];
for(int i = 1; i < intervals.length; i++){
//若当前左边界大于最大有边界(小于等于都算重叠)
if(intervals[i][0] > mostRightBound){
//加入结果区间并更新start
//将一个新的整数数组[start, rightmostRightBound]添加到res中。
result.add(new int[]{start, mostRightBound});
//并重新更新start,mostRightBound
start = intervals[i][0];
mostRightBound = intervals[i][1];
}else{
//当前左边界小于等于最大右边界,则直接在结果集中更新最大右边界
mostRightBound = Math.max(mostRightBound, intervals[i][1]);
}
}
result.add(new int[]{start, mostRightBound});
return result.toArray(new int[result.size()][]);
}
}