代码随想录DAY31|56. 合并区间、738.单调递增的数字、968.监控二叉树
1. 合并区间
力扣
涉及重叠区间问题,首先仍然是将所有元素进行排序。用一个start和end记录当前重叠的区间,如果当前遍历到的元素左边界小于等于区间边界,则更新区间右边界end;如果没有交叉,则将当前区间记录到结果,同时更新start和end。注意全部遍历完之后要将最后一个start -> end区间加到结果里。
class Solution {
public int[][] merge(int[][] intervals) {
List<int []> res = new LinkedList<>();
Arrays.sort(intervals,(a,b)->(a[0] - b[0]));
int start = intervals[0][0];
int end = intervals[0][1];
for(int i = 1; i < intervals.length; i++){
if(intervals[i][0] <= end){
end = Math.max(intervals[i][1], end);
}else{
res.add(new int[]{start, end});
start = intervals[i][0];
end = intervals[i][1];
}
}
res.add(new int[]{start, end});
return res.toArray(new int[res.size()][]);
}
}
2. 单调递增的数字
力扣
本题涉及字符串、字符数组和整数的互相替换,要掌握相关的方法。
对于非递增的情况,如98,strNum[i - 1] > strNum[i],要将strNum[i - 1]–,strNum[i]和后面的部分都置为9。然后要考虑遍历的方向。如果从前向后遍历,会出现332变成329,前面变得非递增了,所以只能从后往前遍历。
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int start = s.length();
for(int i = s.length() - 1; i > 0; i--){
if(chars[i - 1] > chars[i]){
chars[i - 1]--;
start = i;
}
}
for(int i = start; i < chars.length; i++){
chars[i] = '9';
}
return Integer.parseInt(String.valueOf(chars));
}
}
3. 监控二叉树
二刷补上