代码随想录算法训练营Day31 | 56. 合并区间 738.单调递增的数字
56. 合并区间
问题描述:
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
解决方式:
class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));List<int[]> marge = new ArrayList<>();//当前区间int[] currentInterval = intervals[0];marge.add(currentInterval);//始终比较结果集合中最后一个区间与当前遍历到的区间for(int[] interval : intervals){int currentEnd = currentInterval[1];int nextStart = interval[0];int nextEnd = interval[1];if(currentEnd >= nextStart){currentInterval[1] = Math.max(currentEnd,nextEnd);}else{currentInterval = interval;marge.add(currentInterval);}}return marge.toArray(new int[0][]);}
}
738.单调递增的数字
问题描述:
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
解决方式:
class Solution {public int monotoneIncreasingDigits(int n) {char[] digits = String.valueOf(n).toCharArray();int mark = digits.length; // 标记需要置为'9'的起始位置// 从右向左扫描for (int i = digits.length - 1; i > 0; i--) {if (digits[i] < digits[i - 1]) {digits[i - 1]--;mark = i; // 只更新最左边的mark}}// 将mark之后的所有位都置为'9'for (int i = mark; i < digits.length; i++) {digits[i] = '9';}return Integer.parseInt(new String(digits));}
}