LC 56. 合并区间
以数组 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] 可被视为重叠区间。
解题思路:以开始坐标进行排序,然后判断后面的开始坐标是否小于前面的结束坐标
代码:
var merge = function(intervals) {
intervals.sort((a,b) => { //以起始位置做升序排序
return a[0] - b[0]
})
let res = [];
let cur = intervals[0]; //中间值 初始值为数组中的第一个值
for(let i = 0; i < intervals.length; i++) {
if(intervals[i][0] <= cur[1]) { //判断当前值的开始坐标是否小于中间值的结束坐标
cur = [cur[0], Math.max(cur[1], intervals[i][1])]; //若是的话,将当前值的结束坐标替换掉中间值的结束坐标
} else { //不是的话 将中间坐标放入输出结果数组中, 然后中间值换为当前值
res.push(cur);
cur =intervals[i];
}
}
res.push(cur); //循环完了,再将最后一个中间值放进 结果数组中
return res;
};
LC 738. 单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10
输出: 9
示例 2:
输入: n = 1234
输出: 1234
示例 3:
输入: n = 332
输出: 299
解题思路:要的到最小且递增的,先从后往前遍历,得到小于这个数的结果。然后再从前往后遍历,得到递增的结果。
代码:
var monotoneIncreasingDigits = function(n) {
n = n.toString().split('').map(item => {//将数拆分出来,并转换为整数
return +item
})
let flag = Infinity; //设立一个值,存放当前值大于下一个值的位置
for(let i = n.length - 1; i > 0; i--) { //从后往前遍历,直到得到最小的 flag
if(n[i - 1] > n[i]) {
n[i - 1] = n[i - 1] - 1;
flag = i
}
}
for(let i = flag; i < n.length; i++) { //按照得到的 flag ,往后遍历,将后面的值都弄成 9
n[i] = 9;
}
n = n.join('');
return n;
};