题目:
- 无重叠区间
763.划分字母区间- 合并区间
学习内容:
435. 无重叠区间
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> {
return Integer.compare(a[0], b[0]);
});
int count = 0;
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] >= intervals[i - 1][1]) {
continue; // 如果区间不重叠,则啥也不做
} else {
count++;
intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]);
}
}
return count;
}
}
763.划分字母区间
如果确定了字符串中每个字母的最右位置,这样再遍历数组,在每个区间的最右位置最大值停下来,更新区间左右边界,即可得到每个片段的长度。
class Solution {
public List<Integer> partitionLabels(String s) {
// 获取字符串中每个字母所对应的最右边界
int[] hash = new int[26];
for (int i = 0; i < s.length(); i++) {
hash[s.charAt(i) - 'a'] = i;
}
// 遍历字符串,确定每个片段的长度
int left = 0, right = 0;
List<Integer> res = new ArrayList<Integer>();
for (int i = 0; i < s.length(); i++) {
right = Math.max(right, hash[s.charAt(i) - 'a']);
if (i == right) {
res.add(right - left + 1);
left = right + 1;
}
}
return res;
}
}
56. 合并区间
这道题和前面重叠区间类似,但是又有不同。首先我们还是按照左边界对所有区间进行排序,其次我们遍历所有区间,如果有重叠,则合并区间,没有重叠,则直接将当前区间加入结果集。
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new ArrayList<>();
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
res.add(intervals[0]);
for (int i = 1; i < intervals.length; i++) {
// 如果区间不重叠,则直接将当前区间加入res;如果重叠,则合并区间
if (intervals[i][0] > res.getLast()[1]) {
res.add(intervals[i]);
} else {
int left = res.getLast()[0];
int right = Math.max(intervals[i][1], res.getLast()[1]);
res.removeLast();
res.add(new int[]{left, right});
}
}
return res.toArray(new int[res.size()][]);
}
}
学习时间:
2024.4.18