贪心算法 | part05

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,然后其他元素保持单调递增。

相关推荐
拓恒技术4 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
晨曦中的暮雨4 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫4 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
罗西的思考6 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
淡海水6 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
下一站春风里8 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot8 小时前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
用户老李9 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法
深圳市益普科技有限公司10 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
程序员清风11 小时前
算法题中的边界条件、测试与调试
开发语言·算法·kotlin