贪心算法 | part05

56. 合并区间 - 力扣(LeetCode)

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

  • 输入: intervals = \[1,3,2,6,8,10,15,18]
  • 输出: \[1,6,8,10,15,18]
  • 解释: 区间 1,32,6 重叠, 将它们合并为 1,6.

示例 2:

  • 输入: intervals = \[1,4,4,5]

  • 输出: \[1,5]

  • 解释: 区间 1,44,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,然后其他元素保持单调递增。

相关推荐
To_OC9 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与13 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络18 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络2 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4002 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4002 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法