无重叠区间
力扣连接:435. 无重叠区间(中等)
1.贪心的方法
重复的区域
图解步骤
关键点:
- 与射爆气球题目一样
代码
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if(intervals.length==1) return 0;
Arrays.sort(intervals,(a,b)->Integer.compare(a[0], b[0]));
int result = 0;
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]);
result++;
}
}
return result;
}
}
划分字母区间
力扣连接:763. 划分字母区间(中等)
1.贪心的方法
寻找最远的出现位置!
图解步骤
关键点:
- 设置left和right指针
- 通过更新int[] 遍历一遍即可获取每个元素的最远距离
代码
class Solution {
public List<Integer> partitionLabels(String s) {
int[] maxL = new int[27];
//遍历一遍,找元素最远出现的位置
for(int i=0;i<s.length();i++){
maxL[s.charAt(i)-'a']=i;
}
List<Integer> result = new ArrayList<>();
int left = 0; int right = 0;
for(int i=0;i<s.length();i++){
int curMax = maxL[s.charAt(i)-'a'];
right = Math.max(right, curMax);
if(i==right){
result.add(right+1-left);
left = i+1;
}
}
return result;
}
}
合并区间
力扣连接:56. 合并区间(中等)
图解步骤
关键点:
- 合并区域
代码
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length==1) return intervals;
LinkedList<int[]> result = new LinkedList<>();
Arrays.sort(intervals,(a, b)->Integer.compare(a[0], b[0]));
result.add(intervals[0]);
for(int i=1;i<intervals.length;i++){
if(intervals[i][0] <= result.getLast()[1]){
int[] last = result.getLast();
last[1] = Math.max(last[1], intervals[i][1]);
result.removeLast();
result.addLast(last);
}else{
result.addLast(intervals[i]);
}
}
return result.toArray(new int[result.size()][]);
}
}