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

相关推荐
木子墨5167 分钟前
LeetCode 热题 100 精讲 | 计算几何篇:点积叉积 · 线段相交 · 凸包 · 多边形面积
c++·算法·leetcode·职场和发展·动态规划
源码之家17 分钟前
计算机毕业设计:Python棉花产业数据可视化与预测系统 Django框架 ARIMA算法 数据分析 可视化 爬虫 大数据 大模型(建议收藏)✅
人工智能·python·算法·信息可视化·数据挖掘·django·课程设计
py有趣17 分钟前
力扣热门100题之最小路径和
算法·leetcode
qeen8724 分钟前
【算法笔记】前缀和经典题目解析
c语言·c++·笔记·学习·算法
Je1lyfish26 分钟前
Haskell 初探
开发语言·笔记·算法·rust·lisp·抽象代数
im_AMBER34 分钟前
Leetcode 159 无重复字符的最长子串 | 长度最小的子数组
javascript·数据结构·学习·算法·leetcode
浮芷.1 小时前
微观搜打撤:基于鸿蒙flutter的内存快照算法的局内外状态隔离与高阶背包系统设计
算法·flutter·华为·开源·harmonyos·鸿蒙
郝学胜-神的一滴1 小时前
[力扣 105]二叉树前中后序遍历精讲:原理、实现与二叉树还原
数据结构·c++·算法·leetcode·职场和发展
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.04.20 题目:2078.两栋颜色不同而距离最远的房子
笔记·算法·leetcode
闻缺陷则喜何志丹1 小时前
【ST表 前缀和】P7809 [JRKSJ R2] 01 序列|普及+
c++·算法·前缀和·洛谷·st表