day37 贪心 | 56,738

  •  56. 合并区间 
    • 先按照左边界进行排序,然后判断右边界是否重叠,更新区间
  • 738.单调递增的数字 
    • 从后往前遍历 如果发现前一个数 > 后一个数,将前一个数 - 1,后一个变成9
package algor.trainingcamp;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description:
 * 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/merge-intervals
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 * @date 2023/5/11 08:10
 */
public class LeetCode56 {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new ArrayList<>();
        if(null == intervals || intervals.length == 0){
            return res.toArray(new int[0][]);
        }

        Arrays.sort(intervals, (a,b) -> a[0] - b[0]);
        int i = 0;
        while(i < intervals.length){
            int left = intervals[i][0];
            int right = intervals[i][1];

            //出现重叠区间
            while(i < intervals.length - 1 && intervals[i + 1][0] <= right){
                //定义重叠区间右边界
                right = Math.max(intervals[i + 1][1], right);
                i++;
            }
            i++;

            res.add(new int[]{left, right});
        }

        return res.toArray(new int[0][]);
    }
}
package algor.trainingcamp;

/**
 * @author lizhe
 * @version 1.0
 * @description:
 * 给定一个非负整数 N,找出小于或等于 N 的最大的整数,
 * 同时这个整数需要满足其各个位数上的数字是单调递增。
 * (当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
 * @date 2023/5/11 07:50
 *
 * 思路: 从后往前遍历 如果发现前一个数 > 后一个数,将前一个数 - 1,后一个变成9
 */
public class LeetCode738 {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] chars = s.toCharArray();
        int index = chars.length;
        for(int i = chars.length - 1;i >= 1;i--){
            if(chars[i - 1] > chars[i]){
                chars[i - 1]--;
                index = i;
            }
        }

        for(int i = index;i < chars.length;i++){
            chars[i] = '9';
        }

        return Integer.parseInt(new String(chars));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值