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

相关推荐
noipp2 分钟前
推荐题目:洛谷 P1115 最大子段和
算法
Lumbrologist2 分钟前
【C++】零基础入门 · 第 17 节:多线程编程基础
java·c++·算法
轻闲一号机29 分钟前
【语音】笔记
前端·笔记·算法
aWty_41 分钟前
实分析入门(12)--可测函数
学习·数学·算法·实变函数
海砥装备HardAus1 小时前
无人机姿态解算中「重力矢量观测退化」机理与动态补偿技术
算法·无人机·飞控
广州灵眸科技有限公司1 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 开发套件组装上电
网络·数据库·人工智能·算法·飞书
SuperHeroWu71 小时前
【算法】强化学习中奖励和损失函数的关系
算法·环境·强化学习·损失函数·奖励
voidmort1 小时前
9. 微调(Fine-tuning)的数学原理
人工智能·算法·机器学习
晚风吹红霞1 小时前
C++ stack 和 queue 完全指南:适配器模式与双端队列的奥秘
c++·算法·适配器模式
casual~2 小时前
十六届蓝桥杯国赛个人题解
经验分享·学习·算法·蓝桥杯