31.代码随想录算法训练营第三十一天|56. 合并区间,738. 单调递增的数字 ,968. 监控二叉树(一刷跳过)
56. 合并区间 - 力扣(LeetCode),
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
class Solution {public int[][] merge(int[][] intervals) {List<List<Integer>> res = new LinkedList<>();Arrays.sort(intervals,(x,y)->Integer.compare(x[0],y[0]));int left = intervals[0][0];int right = intervals[0][1];for(int i = 1;i < intervals.length;i++){if(intervals[i][0] > right){res.add(new ArrayList<>(Arrays.asList(left,right)));left = intervals[i][0];right = intervals[i][1];}else{right = Math.max(intervals[i][1],right);}}res.add(new ArrayList<>(Arrays.asList(left,right)));int[][] result = new int[res.size()][2];for (int i = 0; i < res.size(); i++) {result[i][0] = res.get(i).get(0);result[i][1] = res.get(i).get(1);}return result;}
}
738. 单调递增的数字 - 力扣(LeetCode)
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10
输出: 9
示例 2:
输入: n = 1234
输出: 1234
示例 3:
输入: n = 332
输出: 299
提示:
0 <= n <= 109
思想:因为判断的是单调递增,如果从前往后遍历,后续的节点会受到再后面节点的影响。如果从后往前遍历,后面的已经变得有序,然后再加入,让之前得再变得有序。
class Solution {public int monotoneIncreasingDigits(int n) {String s = String.valueOf(n);char[] chars = s.toCharArray();int start = chars.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<s.length();i++){chars[i] = '9';}return Integer.parseInt(String.valueOf(chars));}
}