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

相关推荐
MediaTea2 小时前
Python:迭代器的应用场景
开发语言·python·算法
uesowys2 小时前
Apache Spark算法开发指导-Random forest regression
算法·spark
闻缺陷则喜何志丹3 小时前
【期望 DFS】P9428 [蓝桥杯 2023 国 B] 逃跑
c++·算法·蓝桥杯·深度优先·洛谷
IT猿手3 小时前
基于分解的多目标进化算法(MOEA/D)求解46个多目标函数及一个工程应用,包含四种评价指标,MATLAB代码
开发语言·算法·matlab
落羽的落羽3 小时前
【C++】深入浅出“图”——最短路径算法
java·服务器·开发语言·c++·人工智能·算法·机器学习
YGGP3 小时前
【Golang】LeetCode 42. 接雨水
算法·leetcode·职场和发展
仰泳的熊猫3 小时前
题目1466:蓝桥杯基础练习VIP-字符串对比
数据结构·c++·算法·蓝桥杯
Renhao-Wan3 小时前
Java算法实践(二):堆与PriorityQueue实战
java·数据结构·算法
每天要多喝水3 小时前
动态规划Day29:打家劫舍
算法·动态规划