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));
}
}