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()][]);}
}