当前位置: 首页 > news >正文

代码随想录算法训练营第三十一天

LeetCode.56 合并区间

题目链接 合并区间

题解

class Solution {public int[][] merge(int[][] intervals) {List<int[]> res = new LinkedList<>();Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));for(int i = 1;i<intervals.length;i++){if(intervals[i][0] <= intervals[i-1][1]){intervals[i][0] = intervals[i-1][0];intervals[i][1] = Math.max(intervals[i-1][1],intervals[i][1]);}else {res.add(intervals[i-1]);}}res.add(intervals[intervals.length - 1]);return res.toArray(new int[res.size()][]);}
}

解题思路

这段代码实现了区间合并的功能,用于将重叠的区间合并为一个连续的区间。让我为你解释它的工作原理:

问题描述:给定一个区间的集合,合并所有重叠的区间,并返回合并后的区间集合。

代码采用了排序与贪心结合的策略,具体实现步骤如下:

  1. 首先对所有区间按照起始点(start)进行排序
  2. 创建一个列表res用于存储合并后的区间
  3. 遍历排序后的区间:
    • 如果当前区间的起始点小于等于前一个区间的结束点,说明两个区间重叠
      • 将当前区间的起始点更新为前一个区间的起始点
      • 将当前区间的结束点更新为两个区间结束点的最大值(合并操作)
    • 如果不重叠,则将前一个区间加入结果列表
  4. 循环结束后,将最后一个区间加入结果列表
  5. 将列表转换为数组并返回

这种方法的时间复杂度是 O (n log n),主要来自排序操作;空间复杂度是 O (n),用于存储结果。

例如,对于输入[[1,3],[2,6],[8,10],[15,18]],代码会将其合并为[[1,6],[8,10],[15,18]]

这个算法的关键在于:通过排序确保区间按起始点有序,然后通过一次遍历完成合并操作,每次遇到重叠区间就进行合并,不重叠则保存前一个区间。

LeetCode.738 单调递增的数字

题目链接 单调递增的数字

题解

class Solution {public int monotoneIncreasingDigits(int n) {// 处理特殊情况if (n < 10) {return n;}// 将数字按位拆分,存储到列表(从低位到高位)List<Integer> list = new ArrayList<>();while (n > 0) {list.add(n % 10);n /= 10;}// 转换为数组并反转,变为从高位到低位存储int[] arr = new int[list.size()];for (int i = 0; i < list.size(); i++) {arr[list.size() - 1 - i] = list.get(i);}int flag = arr.length; // 标记需要设为9的起始位置// 从高位向低位检查for (int i = arr.length - 2; i >= 0; i--) {if (arr[i] > arr[i + 1]) {arr[i]--; // 当前位减1flag = i + 1; // 标记后面的位置都要设为9}}// 将flag位置及之后的所有位设为9for (int i = flag; i < arr.length; i++) {arr[i] = 9;}// 重新组合成数字int res = 0;for (int num : arr) {res = res * 10 + num;}return res;}
}

解题思路

这段代码实现了 "单调递增的数字" 问题的解决方案,其目标是找到小于或等于给定整数 n 的最大单调递增整数(即每一位数字都大于或等于前一位数字)。

让我为你解释它的工作原理:

代码的核心思路是通过调整数字的每一位来确保其单调递增特性,具体步骤如下:

  1. 特殊情况处理:如果输入数字小于 10,直接返回该数字(单个数字本身就是单调递增的)

  2. 数字拆分与重组

    • 将数字按位拆分,先从低位到高位存储到列表
    • 转换为数组并反转,变为从高位到低位存储,便于后续处理
  3. 寻找调整位置

    • 使用 flag 标记需要设为 9 的起始位置,初始值为数组长度
    • 从高位向低位检查(实际是从数组的倒数第二位向前遍历)
    • 当发现当前位大于后一位时,说明违反了单调递增规则:
      • 将当前位减 1
      • 更新 flag 为当前位置的后一位(标记从这里开始后面的数字都要设为 9)
  4. 设置为 9:将 flag 位置及之后的所有位都设为 9,这是为了保证得到的数字是最大可能的

  5. 重组数字:将处理后的数组重新组合成整数并返回

例如,对于输入 332

  • 拆分后得到数组 [3, 3, 2]
  • 检查发现 3 > 2(索引 1 和 2),将索引 1 的 3 减 1 变为 2,设置 flag = 2
  • 将 flag 位置及之后设为 9,得到 [3, 2, 9]
  • 但继续检查发现 3 > 2(索引 0 和 1),将索引 0 的 3 减 1 变为 2,设置 flag = 1
  • 最终数组变为 [2, 9, 9],组合得到结果 299

这种方法的时间复杂度是 O (d),其中 d 是数字的位数;空间复杂度也是 O (d),用于存储拆分后的数字。

LeetCode.968.监控二叉树

该题目了解大概思路 还没解决

http://www.lryc.cn/news/599605.html

相关文章:

  • 卡尔曼滤波器噪声方差设置对性能影响的仿真研究
  • MATLAB 设置默认启动路径为上次关闭路径的方法
  • 【优选算法】链表
  • 从 SQL Server 到 KingbaseES V9R4C12,一次“无痛”迁移与深度兼容体验实录
  • UG创建的实体橘黄色实体怎么改颜色?
  • 每日算法-数组合并
  • [RPA] Excel中的字典处理
  • ubuntu22.04.4锁定内核应对海光服务器升级内核无法启动问题
  • CPU(中央处理器)和GPU(图形处理器)的区别
  • 在线事务型的业务、实时分析类业务、离线处理类型的业务
  • 如何提高微信小程序的应用速度
  • 代码随想录算法训练营第五十三天|图论part4
  • 基于spring boot的纺织品企业财务管理系统(源码+论文)
  • vue+iview+i18n国际化
  • Qt:qRegisterMetaType函数使用介绍
  • 如何在 FastAPI 中玩转 GraphQL 和 WebSocket 的实时数据推送魔法?
  • 【数据库】AI驱动未来:电科金仓新一代数据库一体机如何重构性能边界?
  • ESP32学习笔记_Peripherals(4)——MCPWM基础使用
  • 内存优化:从堆分配到零拷贝的终极重构
  • IPv6实战指南:从接入到应用
  • 升级的MS2130S USB3.0高清视频采集芯片
  • 服务器安装虚拟机全步骤
  • 每日一道算法题(八)
  • C++实战:数据标准化高效实现
  • Redis 5.0.14安装教程
  • c# openxml 打开加密 的word读取内容
  • mac下 vscode 运行 c++无法弹出窗口
  • 0人工沟通,它如何用AI撬动海外B端9400亿采购市场?
  • 工程师实践出真知
  • 用友ERP 反射xss漏洞复现(CVE-2025-2709)