力扣算法JS LC [56. 合并区间] LC [738. 单调递增的数字]

 

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;
};
posted @ 2022-07-23 21:37  小宝想学好前端  阅读(77)  评论(0编辑  收藏  举报