Leetcode 435. 无重叠区间
题目链接
思路:贪心算法
代码:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
// 按照区间左边界排序,相交的时候取最小的右边
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
int remove = 0;
int pre = intervals[0][1];
for(int i = 1; i < intervals.length; i++) {
if(pre > intervals[i][0]) {
remove++;
pre = Math.min(pre, intervals[i][1]);
} else {
pre = intervals[i][1];
}
}
return remove;
}
}
Leetcode 763.划分字母区间
题目链接
思路:统计每一个字符最后出现的位置
代码:
class Solution {
public List<Integer> partitionLabels(String s) {
// 统计每一个字符最后出现的位置
// 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
List<Integer> result = new LinkedList<>();
int[] edge = new int[26];
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
edge[chars[i] - 'a'] = i;
}
int left = 0;
int right = 0;
for (int i = 0; i < chars.length; i++) {
right = Math.max(right, edge[chars[i] - 'a']);
if (i == right) {
result.add(right - left + 1);
left = i + 1;
}
}
return result;
}
}
Leetcode 56.合并区间
题目链接
思路:贪心算法,先根据一边进行排序
代码:
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> result = new LinkedList<>();
// 按照左边界排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
// 最小左边界
int start = intervals[0][0];
// 最大右边界
int mostRightBound = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
// 如果左边界大于最大右边界
if (intervals[i][0] > mostRightBound) {
// 加入区间,并更新start
result.add(new int[]{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()][]);
}
}