day31:贪心part5,重叠区间
435.无重叠区间
射箭是多出来一个重叠区间 count + 1
本题是多一个区间重叠 count + 1
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
int preRight = intervals[0][1];
int count = 0;
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < preRight) {
count++;
preRight = Math.min(preRight, intervals[i][1]);
} else preRight = intervals[i][1];
}
return count;
}
}
763.划分字母区间
每个字母更新最短结束右边界
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> ans = new LinkedList<>();
char[] chars = s.toCharArray();
int[] edge = new int[26];
for (int i = 0; i < chars.length; i++)
edge[chars[i] - 'a'] = i;
int left = -1;
int right = 0;
for (int i = 0; i < chars.length; i++) {
right = Math.max(right, edge[chars[i] - 'a']);
if (i == right) {
ans.add(i - left);
left = i;
}
}
return ans;
}
}
56.合并区间
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
List<int[]> ans = new LinkedList<>();
int start = intervals[0][0];
int end = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] > end) {
ans.add(new int[]{start, end});
start = intervals[i][0];
end = intervals[i][1];
} else end = Math.max(end, intervals[i][1]);
}
ans.add(new int[]{start, end});
return ans.toArray(new int[ans.size()][]);
}
}