[豪の算法奇妙冒险] 代码随想录算法训练营第三十一天 | 56-合并区间、738-单调递增的数字
代码随想录算法训练营第三十一天 | 56-合并区间、738-单调递增的数字
LeetCode56 合并区间
题目链接:https://leetcode.cn/problems/merge-intervals/description/
文章讲解:https://programmercarl.com/0056.合并区间.html
视频讲解:https://www.bilibili.com/video/BV1wx4y157nD/?vd_source=b989f2b109eb3b17e8178154a7de7a51
重叠区间问题,先排序,让所有的相邻区间尽可能的重叠在一起
按照左边界从小到大排序后,如果 intervals[i][0] <= intervals[i - 1][1] 即 intervals[i] 的左边界 <= intervals[i - 1] 的右边界,则一定有重叠
用合并区间后左边界和右边界,作为一个新的区间加入到result数组即可

class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length == 0 || intervals.length == 1){
return intervals;
}
Arrays.sort(intervals, (a, b)->Integer.compare(a[0], b[0]));
List<int[]> result = new ArrayList<>();
int start = intervals[0][0];
int maxRightEdge = intervals[0][1];
for(int i = 1; i < intervals.length; i++){
if(intervals[i][0] <= maxRightEdge){
maxRightEdge = Math.max(maxRightEdge, intervals[i][1]);
}else{
result.add(new int[]{start, maxRightEdge});
start = intervals[i][0];
maxRightEdge = intervals[i][1];
}
}
result.add(new int[]{start, maxRightEdge});
return result.toArray(new int[result.size()][]);
}
}
LeetCode738 单调递增的数字
题目链接:https://leetcode.cn/problems/monotone-increasing-digits/description/
文章讲解:https://programmercarl.com/0738.单调递增的数字.html
视频讲解:https://www.bilibili.com/video/BV1Kv4y1x7tP/?vd_source=b989f2b109eb3b17e8178154a7de7a51
注意设置tag标记从哪里开始往后赋值为9,初始值不落在数组中以防误伤

class Solution {
public int monotoneIncreasingDigits(int n) {
String str = String.valueOf(n);
char[] num = str.toCharArray();
int tag = num.length;
for(int i = num.length-1; i > 0; i--){
if(num[i] < num[i-1]){
num[i-1]--;
tag = i;
}
}
for(int i = tag; i < num.length; i++){
num[i] = '9';
}
str = String.valueOf(num);
return Integer.parseInt(str);
}
}

浙公网安备 33010602011771号