435. Non-overlapping Intervals
Given an array of intervals intervals where intervals[i] = [starti, endi], return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.
题目解析:
- 如果两个区间是包含关系,则移除大范围的区间
- 如果两个区间部分重叠,则移除后一个区间
代码:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b)->a[0] - b[0]);
int count = 0;
int[] prevInterval = {Integer.MIN_VALUE, Integer.MIN_VALUE};
for (int[] interval : intervals) {
if (interval[0] >= prevInterval[1]) {
prevInterval[0] = interval[0];
prevInterval[1] = interval[1];
} else {
if (interval[1] < prevInterval[1]) {
prevInterval[0] = interval[0];
prevInterval[1] = interval[1];
}
count++;
}
}
return count;
}
}
763. Partition Labels
You are given a string s. We want to partition the string into as many parts as possible so that each letter appears in at most one part.
Note that the partition is done so that after concatenating all the parts in order, the resultant string should be s.
Return a list of integers representing the size of these parts.
题目解析:
- 先求出每个字母的区间,在遍历时可以把当前位置作为左边界,所以只需求出每个字符的有边界即可
代码:
class Solution {
public List<Integer> partitionLabels(String s) {
char[] ca = s.toCharArray();
int[] end = new int[26];
for (int i = 0; i < ca.length; i++) {
end[ca[i] - 'a'] = i;
}
List<Integer> result = new ArrayList<>();
int[] prevInterval = {0, end[ca[0] - 'a']};
for (int i = 1; i < ca.length; i++) {
if (i > prevInterval[1]) {
result.add(prevInterval[1] - prevInterval[0] + 1);
prevInterval[0] = i;
prevInterval[1] = end[ca[i] - 'a'];
} else {
if (end[ca[i] - 'a'] > prevInterval[1]) {
prevInterval[1] = end[ca[i] - 'a'];
}
}
}
result.add(prevInterval[1] - prevInterval[0] + 1);
return result;
}
}
56. Merge Intervals
Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
代码:
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> result = new ArrayList<>();
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
int[] prevInterval = {intervals[0][0], intervals[0][1]};
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] <= prevInterval[1]) {
if (intervals[i][1] > prevInterval[1]) {
prevInterval[1] = intervals[i][1];
}
} else {
result.add(new int[]{prevInterval[0], prevInterval[1]});
prevInterval[0] = intervals[i][0];
prevInterval[1] = intervals[i][1];
}
}
result.add(new int[]{prevInterval[0], prevInterval[1]});
return result.toArray(new int[0][]);
}
}
总结
- 合并或者移除interval一般都要先排序