训练营第四十五天 | 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、概述 首…

selenium 处理网页上的弹窗

处理网页上的弹窗按钮&#xff0c;主要取决于弹窗的类型。在Web自动化测试中&#xff0c;常见的弹窗类型包括&#xff1a;JavaScript弹窗&#xff08;如alert、confirm和prompt弹窗&#xff09;和Web页面自定义弹窗&#xff08;通常是HTML元素实现的&#xff09;。以下是处理这…

Spring中的AOP

目录 一.什么是AOP? 二.SpringAOP的简单实现 三.Spring AOP 详解 1.切点(Pointcut) 切点的定义方式 切点表达式的语法 1) execution表达式 1. *&#xff08;星号&#xff09; 2. ..&#xff08;两个点&#xff09; 3. &#xff08;加号&#xff09; 2)annotation 2…

LeetCode 416-分割等和子集

分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11…

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

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

监督学习:从数据中学习预测模型的艺术与科学

目录 引言 一、监督学习的基本概念 1、数据集 2、特征 3、标签 4、模型 二、监督学习的原理和方法 1、基本原理 2、常用方法 三、监督学习的定义与分类 1、 定义 2.、分类 四、为什么是监督学习&#xff1f; 1、 明确的学习目标 2、高准确率 3、易于评估 4、 …

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…

基于YOLO的目标检测系统

探索未来的智能视觉技术 在当今快速发展的科技领域中&#xff0c;基于YOLO&#xff08;You Only Look Once&#xff09;的目标检测系统成为了领先的智能视觉解决方案。这些系统通过深度学习技术实现快速、准确地识别和定位图像或视频中的各种目标&#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;它大大简化了网络应用的开发过程…

kafka 集群为什么依赖 zookeeper ?

kafka 集群为什么依赖 zookeeper ? 在 Kafka 集群中,ZooKeeper 扮演了关键的角色,负责协调和管理 Kafka 的分布式系统。具体来说,ZooKeeper 在 Kafka 集群中主要起到以下几个作用: 1. 管理集群元数据 ZooKeeper 存储和管理 Kafka 集群的元数据信息,包括 Broker 信息、…