训练营第四十五天 | 435. 无重叠区间763.划分字母区间56. 合并区间738.单调递增的数字968.监控二叉树

 435. 无重叠区间

力扣题目链接(opens new window)

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

示例 1:

  • 输入: [ [1,2], [2,3], [3,4], [1,3] ]
  • 输出: 1
  • 解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

  • 输入: [ [1,2], [1,2], [1,2] ]
  • 输出: 2
  • 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

  • 输入: [ [1,2], [2,3] ]
  • 输出: 0
  • 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

思路:

  • 排序

    • 按照区间的右端进行排序。贪心算法的核心在于每一步都选择一个局部最优解,这里局部最优解就是选择结束时间最早的区间,这样可以为后续区间保留更多空间。
  • 遍历区间

    • 选择第一个区间,记录其结束时间。
    • 从第二个区间开始,逐个检查:
      • 如果当前区间的起始时间小于前一个选择区间的结束时间,则说明重叠,需要移除当前区间。
      • 如果当前区间的起始时间不小于前一个选择区间的结束时间,则说明不重叠,更新结束时间为当前区间的结束时间。
class Solution {
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.empty()) return 0;sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b) {return a[1] < b[1];});int cur_end = INT_MIN;int n = 0;for(auto interval: intervals) {if (interval[0] < cur_end) n++;else cur_end = interval[1];} return n;}
};

763.划分字母区间

力扣题目链接(opens new window)

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

示例:

  • 输入:S = "ababcbacadefegdehijhklij"
  • 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

提示:

  • S的长度在[1, 500]之间。
  • S只包含小写字母 'a' 到 'z' 。

思路:

要解决这个问题,可以使用贪心算法和双指针技巧:

  1. 遍历字符串:记录每个字符最后出现的位置。
  2. 划分片段:使用两个指针来确定每个片段的起始和结束位置。
    • 使用两个指针 startend 来表示当前片段的开始和结束位置。
    • 遍历字符串中的每个字符,更新当前片段的结束位置 end 为当前字符的最后出现位置。
    • 如果当前索引 i 达到当前片段的结束位置 end,说明我们找到了一个完整的片段,将其长度加入结果列表中,并更新 start 为下一个片段的开始位置。
  1. 输出结果:将每个片段的长度加入结果列表中。
class Solution {
public:vector<int> partitionLabels(string s) {vector<int> nums(26), len;for (int i = 0; i < s.size(); i++) {nums[s[i] - 'a'] = i;}int start = 0, end = 0;for (int i = 0; i < s.size(); i++) {if (end < nums[s[i] - 'a']) {end = nums[s[i] - 'a'];}if (i == end) {len.push_back(end - start + 1);start = end + 1;                }}return len;}
};

56. 合并区间

力扣题目链接(opens new window)

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

示例 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日更改。 请重置默认代码定义以获取新方法签名。

思路:

  • 排序区间

    • 对区间按起始时间排序,确保处理区间时有序。
  • 初始化结果

    • 检查输入是否为空,如果为空,直接返回空的结果。
    • 初始化结果向量 result,并将第一个区间加入其中。
  • 合并区间

    • 遍历所有区间,如果当前区间的起始时间小于或等于结果向量中最后一个区间的结束时间,则说明它们重叠,更新结果向量中最后一个区间的结束时间。
    • 如果不重叠,将当前区间加入结果向量。
class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if (intervals.empty()) return {};sort(intervals.begin(), intervals.end());vector<vector<int>> result;result.push_back(intervals[0]);for (int i = 1; i < intervals.size(); ++i) {if (intervals[i][0] <= result.back()[1]) {result.back()[1] = max(result.back()[1], intervals[i][1]);} else {result.push_back(intervals[i]);}}return result;}
};

738.单调递增的数字

力扣题目链接(opens new window)

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例 1:

  • 输入: N = 10
  • 输出: 9

示例 2:

  • 输入: N = 1234
  • 输出: 1234

示例 3:

  • 输入: N = 332
  • 输出: 299

说明: N 是在 [0, 10^9] 范围内的一个整数。

思路:

  • 字符串处理

    • 将整数 N 转换为字符串 str,方便进行位数操作。
  • 从后向前检查

    • 从最后一位开始向前遍历,找到第一个不满足递增条件的位置 marker,即 str[i] < str[i - 1]
  • 递减处理

    • marker 前一位的字符减1,确保这一位之前的数字仍然满足递增条件。
  • 后续处理

    • marker 后面的所有位设置为 '9',确保最大化这些位置的数字。
  • 结果返回

    • 将处理后的字符串 str 转换为整数返回。

class Solution {
public:int monotoneIncreasingDigits(int n) {string str = to_string(n);int mark = str.size();for (int i = str.size() - 1; i > 0; i--) {if (str[i] < str[i - 1]) {str[i - 1]--;mark = i;}}for (int j = mark; j < str.size(); j++) str[j] = '9';return stoi(str);}
};

968.监控二叉树

力扣题目链接(opens new window)

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

示例 1:

  • 输入:[0,0,null,0,0]
  • 输出:1
  • 解释:如图所示,一台摄像头足以监控所有节点。

示例 2:

  • 输入:[0,0,null,0,null,0,null,null,0]
  • 输出:2
  • 解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。

提示:

  • 给定树的节点数的范围是 [1, 1000]。
  • 每个节点的值都是 0。

思路:

可以将每个节点标记为三种状态之一:

  1. 该节点已被其子节点监控。
  2. 该节点有一个摄像头。
  3. 该节点未被监控。

通过递归地遍历树,我们可以决定在每个节点上是否需要安装摄像头,并计算所需的最小摄像头数量。

    • 对于每个节点,先递归处理其左子节点和右子节点。
    • 如果左子节点或右子节点未被监控 (0),则当前节点需要一个摄像头 (1),并增加摄像头计数。
    • 如果左子节点或右子节点有摄像头 (1),则当前节点被监控 (2)。
    • 否则,当前节点未被监控 (0)。
  • 递归处理根节点

    • 如果根节点未被监控 (0),需要在根节点安装摄像头
class Solution {
public:int minCameraCover(TreeNode* root) {int cameras = 0;if (dfs(root, cameras) == 0) { // 根节点未被监控cameras++;}return cameras;}private:// 0 - 该节点未被监控// 1 - 该节点有摄像头// 2 - 该节点已被其子节点监控int dfs(TreeNode* node, int& cameras) {if (!node) return 2; // 空节点视为已被监控int left = dfs(node->left, cameras);int right = dfs(node->right, cameras);if (left == 0 || right == 0) {cameras++;return 1; // 当前节点需要一个摄像头}if (left == 1 || right == 1) {return 2; // 当前节点已被其子节点监控}return 0; // 当前节点未被监控}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6/22 第四周 python操作word

学习到了word有四个段落&#xff0c;都可以通过python来操作。 并且课程的体系&#xff0c;只是一个启蒙&#xff0c;需要在公司的项目中熟悉&#xff0c;从而具备专项测试的能力。 后续每天的学习笔记也需要侧重于理解的部分。

【CPP】归并排序

目录 1.归并排序简介代码分析归并的非递归形式 1.归并排序 归并排序&#xff08;MERGE-SORT&#xff09; 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。 将已有序的子序列合并&#xff0c;得到…

NXP实战笔记(十四):32K3xx基于RTD-SDK在S32DS实现HSE的安装。

目录 1、概述 1.1、什么是HSE&#xff1f; 1.2、如何实现HSE的OTA功能 1.3、S32K3放置HSE的地址 2、通过调试器安装HSE 3、通过IVT方式安装HSE 4、坑点慎重踩 4.1、优化等级 4.2、Flash放RAM 4.3、C40_Ip配置更改 4.4、程序烧录 5、测试结果 6、代码链接 1、概述 首…

“论SOA在企业集成架构设计中的应用”必过模板,软考高级,系统架构设计师论文

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service-OrientedArchitecture,SOA)的新型企业应用集成技术,强调将企业和组织内部的资源和业务功能暴露为服务,实现…

vue-json-viewer组件 copyable失效,页面并不现实copy按钮

<json-viewer :value"props.row.param_detail.query" :expand-depth"10" copyable> </json-viewer> 官方文档中&#xff0c;说明&#xff0c;只要在json-viewer中加入 copyable属性&#xff0c;即可实现copy功能&#xff0c;如下图&#xff1…

yolov8环境搭建+训练自己数据集

一、yolov8环境搭建 1. 安装miniconda环境 地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda 选择Python3.8版本 最好安装在C盘 勾选自动添加环境变量 ***以下操作安装过程中关闭代理软件 *** 2. 创建虚拟环境 conda create -n yolov8 python3…

vue自建h5应用,接入企业微信JDK(WECOM-JSSDK),实现跳转添加好友功能

一、项目场景&#xff1a; 1、使用vue开发了一套h5页面的项目 2、这个h5链接是在企业微信里某个地方打开的 3、打开页面的时候有一个好友列表&#xff0c;点击好友列表某一条复制手机号跳转到企业微信添加好友页面 二、实现的效果图 博客只允许上传gif图&#xff0c;所以我只…

浙江工商大学24计算机考研数据,好几个专业都接收调剂,计专复试线284分!

浙江工商大学&#xff08;Zhejiang Gongshang University&#xff09;&#xff0c;简称“浙商大”&#xff08;ZJSU&#xff09;&#xff0c;坐落于浙江省杭州市&#xff0c;是中华人民共和国教育部、中华人民共和国商务部和浙江省人民政府共建的浙江省重点建设高校&#xff0c…

C#调用OpenCvSharp计算并显示带掩膜的图像直方图

之前的文章简要测试了调用OpenCvSharp的Cv2.CalcHist函数计算直方图的用法&#xff0c;不过使用过程中参数mask的值始终为null&#xff0c;也就是计算的整幅图像的直方图&#xff0c;如果mask不为空&#xff0c;则可以计算图像指定区域的直方图&#xff0c;本文学习掩膜的创建方…

css grid实现九宫格布局

常见的九宫格布局可以使用flex布局实现&#xff0c;但是flex布局有个致命的缺陷&#xff0c;比如3行3列的布局&#xff0c;当第不足3个元素的时候&#xff0c;元素依然是平局平铺的&#xff0c;这样就不满足九宫格的效果&#xff0c;这种情况&#xff0c;使用grid布局可以轻松搞…

Zigbee协议详解:低功耗无线通信的理想选择

什么是Zigbee协议 Zigbee是一种基于IEEE 802.15.4标准的无线通信协议&#xff0c;专为低功耗、低数据速率和短距离通信设计。它广泛应用于物联网&#xff08;IoT&#xff09;设备&#xff0c;如智能家居、工业自动化和健康监测等领域。Zigbee协议由Zigbee联盟维护和推广&#x…

Antd Table 表格 拖拽列宽

antd 的表格组件的列宽&#xff0c;是通过width属性去初始化的&#xff0c;有时候渲染的内容不固定&#xff0c;这个宽做不到通用所以研究怎么实现表格列宽拖动&#xff0c;主要的实现步骤如下&#xff1a; 使用table的components API修改表格头部为 react-resizable提供的组件…

C#事件详解及应用示例

简介 事件是使类具备向其它类通知发生的相关事情的能力。事件被分成两部分&#xff1a;一、引发或发送事件的类&#xff08;称发布者&#xff09;&#xff1b;二、处理或接收事件的类&#xff08;称订阅者&#xff09;。事件也是类型的成员。在 .NET 的桌面应用程序中&#xff…

Netty 入门实例

文章目录 1. 概述2. 代码实例2.1 服务端2.2 客户端2.3 运行截图 3. 整体结构4. 重要组件4.1 EventLoopGroup、EventLoop4.2 Handler & Pipeline4.3 ByteBuf 参考文献 1. 概述 Netty 是一款用于高效开发网络应用的 NIO 网络框架&#xff0c;它大大简化了网络应用的开发过程…

MySQL查询语句语法使用

目录 一、基本查询二、条件查询2.1 简单条件表达式2.2 逻辑表达式2.3 模糊查询 (LIKE)2.4 范围查询 (BETWEEN ... AND ...)2.5 列表查询 (IN)2.6 空值查询 (IS NULL 或 IS NOT NULL) 三、排序查询3.1 基本语法3.2 单列排序3.2 多列排序3.3 使用表达式排序 四、分组查询聚合函数…

mysql的安装和连接

一.数据库相关概 念 1.数据库 存储数据的仓库,数据是有组织的进行存储,简称DB。 2.数据库管理系统 操纵和管理数据库的大型软件,简称DBM。 3.SQL 操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。简称SQL。 二.市面上流行的数据库 1.ORACLE 2.MySQL …

如何搭建一个成功的短剧制作平台

要搭建一个成功的短剧制作平台&#xff0c;需要考虑多个方面&#xff0c;包括目标定位、技术选择、内容管理、用户体验等。 1、明确目标和定位&#xff1a; 确定你的目标受众是谁&#xff0c;他们的年龄、兴趣、消费习惯等。 明确短剧制作平台的主要定位&#xff0c;是提供原创…

新能源燃气灶用的是什么燃料?无需燃料,电生明火

新能源燃气灶广义的讲就是用电生明火的烹饪灶具&#xff0c;如&#xff1a;电焰灶、电燃灶或电火灶&#xff0c;无需任何燃料和氧气助燃&#xff1b;而狭义上讲是采用出电能以外的一切新燃料烹饪灶具&#xff0c;如&#xff1a;高功率燃气灶、生物合成油灶等。在厨房革命的浪潮…

01--MySQL数据库概述

目录 第1章 MySQL数据库概述 1.1 基本概念 1.2 MySQL数据库管理系统 1.3 表的关系 第2章 MySQL卸载、安装、登录 第3章 客户端使用演示 3.1 命令行客户端 3.1.1 数据库 3.1.2 数据表 3.1.3 导入数据 3.1.4 导出数据 3.2 可视化客户端 第4章 SQL语句 4.1 SQL的分类…

Linux中的文本编辑器vi与vim

摘要&#xff1a; 本文将深入探讨VI和VIM编辑器的基本概念、特点、使用方法以及它们在Linux环境中的重要性。通过对这两款强大的文本编辑器的详细分析&#xff0c;读者将能够更全面地理解它们的功能&#xff0c;并掌握如何有效地使用它们进行日常的文本编辑和处理任务。 引言&…