代码随想录算法训练营Day37|56.合并区间、738.单调递增的数字、968.监控二叉树
合并区间
56. 合并区间 - 力扣(LeetCode)
和之前的思路类似,先创建一个ans二维数组,创建start和end来指明添加进入ans数组的区间下标,先对数组按照首元素排序从小到大排序后,根据当前元素是否小于下一个元素的第一个元素来决定将这个对ans数组进行增加、移动下标或改变end。具体代码如下。
class Solution {
public:// 定义一个比较函数,用于sort函数,按照区间的起始点进行排序static bool cmp(vector<int>&a, vector<int>&b){return a[0]<b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {// 使用sort函数和自定义的比较函数cmp对区间进行排序sort(intervals.begin(),intervals.end(),cmp);// 定义一个二维向量用于存放合并后的区间vector<vector<int>>ans;// 如果输入的区间为空,直接返回空的ansif(intervals.size() == 0){return ans;}// 如果只有一个区间,直接将该区间放入ans中if(intervals.size() == 1){ans.push_back(vector<int>{intervals[0][0],intervals[0][1]});return ans;}// 初始化起始和结束点为第一个区间的起始和结束点int begin = intervals[0][0];int end = intervals[0][1];for(int i = 0 ; i < intervals.size()-1; i++){// 如果当前区间的起始点大于上一个区间的结束点,说明没有重叠if(intervals[i+1][0] > end){// 将上一个区间加入ans中ans.push_back(vector<int>{begin,end});// 更新区间的起始和结束点为当前区间的起始和结束点begin = intervals[i+1][0];end = intervals[i+1][1];}else// 如果有重叠,更新结束点为当前区间和上一个区间结束点的较大值end = max(intervals[i+1][1],end);// 如果是最后一个区间,将其加入ans中if(i == intervals.size()-2){ans.push_back(vector<int>{begin,end});} }// 返回合并后的区间return ans;}
};
算法的时间复杂度为O(nlogn),空间复杂度为O(n)。
代码随想录中代码
class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() == 0) return result; // 区间集合为空直接返回// 排序的参数使用了lambda表达式sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});// 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并result.push_back(intervals[0]); for (int i = 1; i < intervals.size(); i++) {if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间// 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的result.back()[1] = max(result.back()[1], intervals[i][1]); } else {result.push_back(intervals[i]); // 区间不重叠 }}return result;}
};
- 时间复杂度: O(nlogn)
- 空间复杂度: O(logn),排序需要的空间开销
单调递增的数字
738. 单调递增的数字 - 力扣(LeetCode)
贪心算法,98的最小单调递增数字为89,第一位不符合单调递增的情况,将该值--,并将后面的数字都变为9,使用字符串可以方便对数字进行处理,所以我们先将数字转换为字符串,然后寻找到第一个不符合单调递增情况的数字,之后对该数字以前的数字全部-1,保证其前几位在符合单调递增的情况下最大,最后把后面的数字全部变为9,即实现了最大的单调递增数字。
class Solution {
public:int monotoneIncreasingDigits(int n) {// 将整数n转换为字符串s,以便逐位处理string s = to_string(n);int i = 1;// 从左到右遍历字符串,直到遇到一个位置i,使得s[i-1] > s[i]// 找到需要调整的位置while(i < s.size() && s[i-1]<=s[i]){i++;}// 如果i没有遍历到字符串的末尾,说明我们找到了需要调整的位置if(i < s.size()){// 从位置i开始,向前遍历,直到s[i-1]不再大于s[i]// 将每个大于其后继的数字减1,这样可以保证数字尽可能大且单调递增while(i > 0 && s[i-1] > s[i]){s[i - 1] -= 1;i-- ; }// 将位置i之后的所有数字都置为'9',这样可以保证这些位置的数字是最大的for(int j = i + 1; j < s.size(); j++){s[j] = '9';}}// 将处理后的字符串s转换回整数并返回return stoi(s);}
};
时间复杂度为O(n),空间复杂度为O(n)。
监控二叉树
968. 监控二叉树 - 力扣(LeetCode)
我开始的想法是用一个层序遍历,然后将偶数层的节点相加得到监控的数目,有些问题,后面再改改。(能力不够,先跳过吧)
class Solution {
public:int minCameraCover(TreeNode* root) {queue<TreeNode*> queue;if(root!=nullptr){queue.push(root);}int count = 0;int flag = 0;TreeNode*cur = root;vector<int>ans;while(!queue.empty()){int size = queue.size();ans.push_back(size);for(int i = 0; i < size; i++){cur = queue.front();queue.pop();if(cur->left){queue.push(cur->left);}if(cur->right){queue.push(cur->right);}}}if(ans.size() <= 2){return 1;}for(int i = 1 ; i < ans.size(); i = i + 2){count += ans[i];}return count;}
};
代码随想录思路
代码随想录 (programmercarl.com)一个监控摄像头最多可以监控父节点、自己和两个子节点,累计三层,若想要最小化摄像头的数目,最优的方式必定要利用好这个特点。叶节点远多于根节点,考虑在叶节点处节约摄像头的数目,选择叶节点的父节点作为摄像头的放置位置。遍历到根节点再放置一个摄像头,所以使用后序遍历。
贪心算法,二叉树与贪心的结合,有点难...... LeetCode:968.监督二叉树_哔哩哔哩_bilibili
思路不好想啊。。。。
二叉树中的每个节点有3个状态。0.无覆盖、1.有摄像头、2.有覆盖
后序遍历,从叶节点往上遍历,总共有四种情况。
1.左右孩子都有覆盖,返回0,此处为无覆盖
2.左右节点存在无覆盖情况,必须放入一个摄像头
3.左右至少存在一个摄像头,当前位置状态为有覆盖
4.根节点状态为无覆盖,放置一个摄像头。
class Solution {
private:int result;int traversal(TreeNode* cur) {// 空节点,该节点有覆盖if (cur == NULL) return 2;int left = traversal(cur->left); // 左int right = traversal(cur->right); // 右// 情况1// 左右节点都有覆盖if (left == 2 && right == 2) return 0;// 情况2// left == 0 && right == 0 左右节点无覆盖// left == 1 && right == 0 左节点有摄像头,右节点无覆盖// left == 0 && right == 1 左节点有无覆盖,右节点摄像头// left == 0 && right == 2 左节点无覆盖,右节点覆盖// left == 2 && right == 0 左节点覆盖,右节点无覆盖if (left == 0 || right == 0) {result++;return 1;}// 情况3// left == 1 && right == 2 左节点有摄像头,右节点有覆盖// left == 2 && right == 1 左节点有覆盖,右节点有摄像头// left == 1 && right == 1 左右节点都有摄像头// 其他情况前段代码均已覆盖if (left == 1 || right == 1) return 2;// 以上代码我没有使用else,主要是为了把各个分支条件展现出来,这样代码有助于读者理解// 这个 return -1 逻辑不会走到这里。return -1;}public:int minCameraCover(TreeNode* root) {result = 0;// 情况4if (traversal(root) == 0) { // root 无覆盖result++;}return result;}
};
算法时间复杂度为O(n),空间复杂度O(n)。
相关文章:
代码随想录算法训练营Day37|56.合并区间、738.单调递增的数字、968.监控二叉树
合并区间 56. 合并区间 - 力扣(LeetCode) 和之前的思路类似,先创建一个ans二维数组,创建start和end来指明添加进入ans数组的区间下标,先对数组按照首元素排序从小到大排序后,根据当前元素是否小于下一个元…...
Web前端开发12章:深入探索与实战解析
Web前端开发12章:深入探索与实战解析 在数字化浪潮的推动下,Web前端开发技术日新月异,成为了构建互联网应用的重要基石。本文将以12章的篇幅,从四个方面、五个方面、六个方面和七个方面,深入探索Web前端开发的精髓&am…...
八股操作系统和计算机网络
5.线程间的同步的方式有哪些? 6.PCB(不熟悉) 进程状态 什么是僵尸进程和孤儿进程? 进程调度算法 死锁的理解 举个发生死锁的例子 解决死锁的方式 内存管理做了哪些事情 什么是内存碎片 常见的内存管理 段表通过什么数据结构实现地址映射 分段机制为什么会…...
正能量情感语录热门素材文案去哪里找?文案素材网站分享
正能量情感语录热门素材文案去哪里找?文案素材网站分享 想为你的作品注入正能量和情感温度?不知如何获取热门情感语录素材?别担心,今天我将为大家推荐一些海外知名的素材网站,让你轻松找到受欢迎的文案素材ÿ…...
bean实例化
黑马程序员SSM 文章目录 一、bean是如何创建的二、实例化bean的三种方式3.1 构造方法(常用)3.2 静态工厂3.3 实例化工厂(了解)3.4 FactoryBean 一、bean是如何创建的 Spring 创建bean的时候使用的是无参构造 二、实例化bean的三…...
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存
💭 写在前面:我们将再次扩展之前的C语言,让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言:有块的作用域 0x01 C- 语言:更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言:有块的…...
React native 使用Animated 优化连续setState 性能问题
再部分场景下我们需要连续更新state刷新页面。一般情况刷新使用setstate没有问题,当需要连续刷新的情况会有明显的性能问题。 场景:自定义可拖动抽屉组件 新增需求在抽屉活动是更新主页面组件样式,此时需要动态传递抽屉高度修改主页组件属性…...
Qt中的事件循环
Gui框架一般都是基于事件驱动的,Qt也不例外,在 Qt 框架中,事件循环(Event Loop)是一个核心机制,负责管理和分发应用程序中的所有事件和消息。它确保了应用程序能够响应用户输入、定时器事件、窗口系统事件等…...
JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)
当实例化一个Java类时,运行时环境必须为相关实例分配存储空间,在JRE中此存储空间分配操作是由内存管理器实现的(其实是JVM的垃圾回收器),由于内存管理器通常使用与运行时目标语言不同的语言编写(例如&#…...
大模型生成的常见Top-k、Top-p、Temperature参数
参考: https://zhuanlan.zhihu.com/p/669661536 topK,topP https://www.douyin.com/video/7380126984573127945 主要是softmax产生的词表每个词的概率分布后, topK,比如K3,表示采样概率最大的前3个,其他全…...
ppt添加圆角矩形,并调整圆角弧度方法
一、背景 我们看的论文,许多好看的图都是用PPT做的,下面介绍用ppt添加圆角矩形,并调整圆角弧度方法。 二、ppt添加圆角矩形,并调整圆角弧度 添加矩形: 在顶部工具栏中,点击“插入”选项卡。 在“插图”…...
测评要求+基本措施+对应产品
基本要求项测评项基本措施对应产品 网络架构 网络架构 网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统 网络架构 网络架构 网络架构应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手…...
什么是git?
前言 Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是的,我对git的介绍就一条,想看简介的可以去百度一下😘😘😘 为什么要用git? OK,想象一下…...
C/C++中内存开辟与柔性数组
C/C中内存的开辟 在C中,我们都知道有三个区: 1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指…...
编程App软件优化是什么
编程App软件优化是什么 在数字化时代,编程App软件已成为我们日常生活和工作中不可或缺的一部分。然而,随着技术的不断进步和用户需求的日益多样化,如何对编程App软件进行优化,以提供更高效、更流畅的用户体验,成为了开…...
爱了爱了,11款超良心App推荐!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/今天,我们向你推荐十款与众不同但又不错的win10软件,它们都有各自的功能和优点,相信你一定会喜欢。 1.图片处…...
Linux基础指令(二)(文件、权限等)
目录 普通文件的操作 touch cat 翻页 标准输出重定向: 标准输出重定向种类: 管道符:| 压缩指令: zip gzip tar Linux下最常见的打包指令 其他系统指令: 快捷…...
爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?
AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件,用过的人都说好! 先来看看我生成的图 制作过程非常简单,输入你想要生成的画面咒语。 工具地址:https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…...
Qt 实战(4)信号与槽 | 4.3、信号连接信号
文章目录 一、信号连接信号1、什么是信号连接信号?2、如何实现信号连接信号3、总结 前言: 在Qt框架中,信号与槽(Signals and Slots)机制是对象间通信的核心。通常情况下,我们习惯于将信号连接到槽函数上&am…...
Day 16:3040. 相同分数的最大操作数目II
Leetcode 相同分数的最大操作数目II 给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个: 选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一…...
Go基础编程 - 07 - 字典(map)及其约束
字典(map) 下一篇:结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇:指针 下一篇:结构体 map 是一种无序的基于 key-value 的数据结构,Go 语言中的 …...
WebSocket 快速入门 与 应用
WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接,以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理: 0.特点: 双向通信:WebSocket 允许服务…...
使用Spring Cloud设计电商系统架构
在当今互联网高速发展的时代,电子商务系统成为了商家与用户互动的主要方式之一。为了能够更好地应对高并发、可扩展性、灵活性等需求,微服务架构逐渐成为设计电商系统的首选方案。Spring Cloud作为一个成熟的微服务框架,为开发人员提供了一整…...
揭开 Docker 容器的神秘面纱:深入理解容器原理
前言 前几年比较火的是微服务,再然后就是云。讨论技术必谈微服务,要上云,开发出的产品也都是某某云。现在讨论比较少了,因为AI盖过他们。还有就是因为容器技术,现在几乎都是k8s,云原生。要比较快的上手k8s…...
Elasticsearch:Open Crawler 发布技术预览版
作者:来自 Elastic Navarone Feekery 多年来,Elastic 已经经历了几次 Crawler 迭代。最初是 Swiftype 的 Site Search,后来发展成为 App Search Crawler,最近又发展成为 Elastic Crawler。这些 Crawler 功能丰富,允许以…...
C 语言连接MySQL 数据库
前提条件 本机安装MySQL 8 数据库 整体步骤 第一步:开启Windows 子系统安装Ubuntu 22.04.4,安装MySQL 数据库第三方库执行 如下命令: sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…...
【探索Linux】P.34(HTTPS协议)
阅读导航 引言一、HTTPS是什么1. 什么是"加密"2. 为什么要加密3. 常见的加密方式(1)对称加密(2)非对称加密 二、证书认证1. CA认证 三、HTTPS的加密底层原理✅非对称加密对称加密证书认证 温馨提示 引言 在上一篇文章中…...
Python 踩坑记 -- 调优
前言 继续解决问题 慢 一个服务运行有点慢,当然 Python 本身不快,如果再编码不当那这个可能就是量级上的劣化。 整个 Code 主线逻辑 1700,各依赖封装 3000,主线逻辑也是很久远的痕迹,长函数都很难看清楚一个 if els…...
英特尔澄清:Core i9处理器崩溃问题根本原因仍在调查,eTVB非主因
英特尔否认了有关已找到导致Core i9崩溃问题根本原因的报道,强调调查仍在继续。此前,德国媒体Igors Lab曾报道,英特尔已经发现了影响第13代猛禽湖(Raptor Lake)和第14代猛禽湖Refresh Core i9处理器稳定性的根源问题&a…...
常用设计网站有哪些软件/seo推广技术
希望和正在或者想要学习使用ISAAC-GYM的朋友一起有一个讨论群,尝试互帮互助,交流学习内容~ 目前刚开始尝试,不知道能不能建立起来,如果有意向请私戳!! ——2023.02 一、常用命令行选项 命令作用–help打印…...
专门做网站的公司 南阳/google安卓手机下载
目前互联网上有无数个开源的建站程序可供大家选择使用,对现在的站长来说真的是容易多了,10年前我作网站的时候,一个小聊天程序也要自己一句一句的写,看看现在的开源程序,层出不穷。太多了也就不知道选哪个好了…...
网站建设丿金手指稳定/seo网页优化平台
MCCS 是什么? MCCS 是什么? …… 如果你没在任何地方听说过这个词,那就对了。因为这个词是本文作者,也就是颐和园创造出来的。 MCCS 是作者创造的一种新的 iOS APP 构建方式和设计模式。它是对 MVC 模式的扩展。其目的是为了解决…...
用dw怎么做网站/淘宝权重查询入口
背景 在上午探索了Windows下时间任务创建运行的可视化界面和Schtasks命令行工具且默默失败后,下午我决定不依不饶地去看一下Linux系统下是怎么创建时间任务的。其实我Linux接触得不多,而且今天也是新接触的crontab命令,所以不免会踩坑踩雷&am…...
网站做好后怎么做seo/免费制作网站app
#!/usr/bin/env python#! _*_ coding:utf-8 _*_ #注:多实例DB数据,my.conf,sock文件目录要统一#每个实例要建有shutdown权限mt_user用户 import os,sysimport socket myd /usr/local/mysql/bin/mysqld#1myadmin /usr/local/mysql/bin/mysqladminm_user rootm_password exsd…...