Day35题目
LeetCode435.无重叠区间:移除几个元素,使得不重叠
核心思想:排序区间之后,如果重叠,更新下一个区间的右边界为最小值.如果重叠了,最少移除其中一个,更新移除的那个为最小的右边界之后就不会影响到之后的区间判断
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
// 首先sort一下
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-1][1] > intervals[i][0]){
intervals[i][1] = Math.min(intervals[i][1],intervals[i-1][1]);
count ++;
}
}
return count;
}
}
LeetCode763.划分字母
核心思想:获取字母的区间,然后如果遍历,遇到哪个字母右边界大于目前右边界,就更新遍历的终点.如果遍历到终点,说明这个区间内的所有包含的字母都只出现在目前这段区间内,我本来使用的map存储每一个区间,后面优化只用存储最后出现的地方就行了
class Solution {
public List<Integer> partitionLabels(String s) {
int[] hash = new int[27];
List<Integer> res = new ArrayList<>();
// 存储字母出现的最后一个位置
for(int i = 0 ; i < s.length(); i ++){
hash[s.charAt(i)-'a'] = i;
}
int start = -1;
int end= hash[s.charAt(0)-'a'];
for(int i = 0; i < s.length(); i ++){
if(hash[s.charAt(i)-'a'] > end ){
end = hash[s.charAt(i)- 'a'];
}
if(end == i){
res.add(i-start);
start = i;
}
}
return res;
}
}
LeetCode56.合并区间:合并区间使得其中没有重叠或者相邻的区间
核心思想:排序后遍历,遇到相重叠的区间,将最小左边界到最大右边界存到结果集
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(a,b)->{
return a[0]-b[0];
});
List<int[]> res = new ArrayList<>();
res.add(intervals[0]);
for(int i = 1 ; i < intervals.length ; i ++){
if(res.getLast()[1] >= intervals[i][0] ){
int[] temp = new int[]{res.getLast()[0],Math.max(intervals[i][1],res.getLast()[1])};
// 如果这个和上一个重叠了,那么把上一个移除,加入合并后的区间
res.removeLast();
res.add(temp);
}else{
res.add(intervals[i]);
}
}
return res.toArray(new int[res.size()][]);
}
}