56. 合并区间 - 力扣(LeetCode)
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
-
注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。
public int[][] merge(int[][] intervals) {
// 处理空数组情况
if (intervals == null || intervals.length == 0) {
return new int[0][];
}ArrayList<int[]> res = new ArrayList<>(); // 按左端点升序排序 Arrays.sort(intervals, (a, b) -> a[0] - b[0]); // 初始化当前合并区间的左右边界 int left = intervals[0][0]; int right = intervals[0][1]; // 从第二个区间开始遍历 for (int i = 1; i < intervals.length; i++) { if (intervals[i][0] <= right) { // 重叠:扩展右边界 right = Math.max(right, intervals[i][1]); } else { // 不重叠:保存当前区间,开启新区间 res.add(new int[] { left, right }); left = intervals[i][0]; right = intervals[i][1]; } } // 添加最后一个区间 res.add(new int[] { left, right }); return res.toArray(new int[res.size()][]);}
解题:
先进行排序,是为了让会重叠的区域重叠,并且好处理。然后就是用当前的right去检验是否有重叠,有重叠就进行更新right
738. 单调递增的数字 - 力扣(LeetCode)
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 1:
- 输入: N = 10
- 输出: 9
示例 2:
- 输入: N = 1234
- 输出: 1234
示例 3:
- 输入: N = 332
- 输出: 299
说明: N 是在 [0, 10^9] 范围内的一个整数。
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int start = s.length();
for (int i = s.length() - 2; i >= 0; i--) {
if (chars[i] > chars[i + 1]) {
chars[i]--;
start = i + 1;
}
}
for (int i = start; i < s.length(); i++) {
chars[i] = '9';
}
return Integer.parseInt(String.valueOf(chars));
}
解题:
我们采用后序遍历的方法,这样不用考虑前面的数值如何。我们每次考虑俩个元素的大小。然后定义一个flag,因为我们希望找到最大的。所以我们要用flag去记录哪些数值需要变成9,然后其他元素保持单调递增。