代码随想录算法训练营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)。

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

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

相关文章

【three.js】自定义物体形状BufferGeometry

目录 一、认识缓冲类型几何体BufferGeometry 二、将各个顶点连线 一、认识缓冲类型几何体BufferGeometry threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BoxGeometry类构建的,BufferGeometry是一个没有任何形状的空几何体,你可以通过BufferGeometry自定…

SinNerf理解和效果

文章目录 SinNerf 解决的问题方法和结构自己训练的效果 SinNerf 解决的问题 该方法主要解决的问题是&#xff1a; 现有都使用多张照片来进行nerf 表示的学习&#xff0c;这篇文章的话&#xff0c;主要是想使用一张单视角的照片来Nerf表示的学习。通过从单张照片中得到的伪标签…

【SpringBoot集成Spring Security】

一、前言 Spring Security 和 Apache Shiro 都是安全框架&#xff0c;为Java应用程序提供身份认证和授权。 二者区别 Spring Security&#xff1a;重量级安全框架Apache Shiro&#xff1a;轻量级安全框架 关于shiro的权限认证与授权可参考小编的另外一篇文章 &#xff1a; …

IDEA模版快速生成Java方法体

新建模版组myLive 在模版组下新建模版finit 在模版text内输入以下脚本 LOGGER.info("$className$.$methodName$>$parmas1$", $parmas2$); try {} catch (Exception e) {LOGGER.error("$className$.$methodName$>error:", e); }LOGGER.info("$c…

win10没有Hyper-v的解决方法

win10没有Hyper-v的解决方法 问题&#xff1a;最近想装下docker&#xff0c;但是在控制面板-程序-启用或关闭Windows功能下找不到Hyper-v节点。 废话不多说&#xff0c;直接上实操教程 1.将下面命令复制到文本文档中&#xff0c;并将文档重命名Hyper.cmd pushd "%~dp0&q…

实用小工具-python esmre库实现word查找

python esmre库实现word查找 前言&#xff1a; 在文本中匹配特定的字符串&#xff0c;一般可以用普通的字符串匹配算法&#xff0c;KMP算法&#xff1b; python中提供了一个库&#xff0c;esmre, 通过预先将字符串存到esm对象中&#xff0c;利用这些字符串从候选的字符串中进行…

Spring Boot实战:图书信息网站

实战概述&#xff1a;Spring Boot图书信息网站开发 项目背景 随着数字化时代的到来&#xff0c;图书信息网站为用户提供了一个便捷的在线浏览和购买图书的平台。本实战项目旨在通过Spring Boot框架开发一个图书信息网站&#xff0c;实现图书展示、用户登录和管理等功能。 项…

【Bazel 】- Examples to build C++ code

Examples to build C code This folder is part of the C Bazel Tutorial, found at https://bazel.build/start/cpp This package will showcase how to build C code in stages. 此文件夹是 C Bazel 教程的一部分&#xff0c;位于 https://bazel.build/start/cpp 此包将展…

Android 自定义View

我们所有的试图都是起源于自定义View&#xff0c;包括ViewGroup也是继承于它&#xff0c;可以说它是视图组件之父。 我们可以从它的大致流程来分为四个部分&#xff1a; 构造方法&#xff0c;onMeasure&#xff0c;onLayout&#xff0c;onDraw 构造方法&#xff1a; 它主要有…

如何判断一个js对象是否存在循环引用

一、背景 在前端JSON.stringfy是我们常用的一个方法&#xff0c;可以将一个对象序列化。 例如将如下对象序列化 const person { name: kalory, age:18}JSON.stringfy(person) // 结果 {"name":"kalory","age":18}将一个数组序列化const arr …

什么是分布式光伏系统?

随着全球对可再生能源和环保技术的日益重视&#xff0c;分布式光伏系统已成为电力领域中不可或缺的一部分。它代表了一种新兴的能源供应方式&#xff0c;具有显著的环保和经济价值。 一、定义与特点 分布式光伏系统是指将光伏组件安装在用户侧&#xff0c;如屋顶、墙面等建筑物…

OperationalError: (_mysql_exceptions.OperationalError)

OperationalError: (_mysql_exceptions.OperationalError) (2006, MySQL server has gone away) 这个错误通常表示客户端(例如你的 Python 程序使用 SQLAlchemy 连接到 MySQL 数据库)和 MySQL 服务器之间的连接被异常关闭了。这个问题可能由多种原因引起,以下是一些常见的原…

ModuleNotFoundError: No module named ‘distutils‘的解决办法

最近想试试odoo17&#xff0c;在windows环境下&#xff0c;想安装试验一下&#xff0c;结果老出现oduleNotFoundError: No module named ‘distutils‘错误。查了一下&#xff0c;以为是python版本导致的&#xff0c;结果试了很多版本如下&#xff1a; 试了几个&#xff0c;每个…

Java——变量作用域和生命周期

一、作用域 1、作用域简介 在Java中&#xff0c;作用域&#xff08;Scope&#xff09;指的是变量、方法和类在代码中的可见性和生命周期。理解作用域有助于编写更清晰、更高效的代码。 2、作用域 块作用域&#xff08;Block Scope&#xff09;&#xff1a; 块作用域是指在…

windows设备/路由设备上ip地址如何查看、使用

在Windows设备上查看本地IP地址&#xff08;IPv4和IPv6&#xff09;&#xff1a; 使用命令提示符&#xff1a; 打开命令提示符&#xff08;在Windows中按Win R&#xff0c;然后输入"cmd"并按Enter&#xff09;。在命令提示符窗口中&#xff0c;输入以下命令以查看…

Redis缓存穿透、缓存雪崩和缓存击穿的解决方案

Redis缓存穿透、缓存雪崩和缓存击穿的解决方案 引言 Redis作为当前非常流行的内存数据结构存储系统&#xff0c;以其高性能和灵活性被广泛应用于缓存、消息队列、排行榜等多种场景。然而&#xff0c;在实际使用过程中&#xff0c;可能会遇到缓存穿透、缓存雪崩和缓存击穿等问…

软件服务中的 SLA 到底是什么?

目录 什么是 SLA SLA 的组成部分 SLA 的重要性 制定和执行 SLA 小结 平常使用云服务或者使用 SaaS 服务时&#xff0c;厂商一般都会承诺 SLA 达到多少&#xff0c;没有达到的话会如何赔偿&#xff0c;例如云服务的稳定性一般会承诺4个9&#xff08;即99.99%&#xff09;。…

C语言:进程

一、进程标识符pid 类型pid_t&#xff0c;16位整型数三万多个。2的16次方65535. 进程标识是顺次向下使用。与文件描述符不一样。 pid_t getpid(void); pid_t getppid(void); 进程正常终止 1.从main函数返回 2.调用exit 3.调用_exit或_Exit 4.最后一个线程…

软考中级|软件设计师-知识点整理

目录 计算机网络概论 计算机系统基础知识 中央处理单元 数据表示 校验码 计算机体系结构 计算机体系结构的发展 存储系统 输入/输出技术 安全性、可靠性与系统性能评测基础知识 加密技术和认证技术 计算机可靠性 程序设计语言基础知识 程序设计语言概述 程序设计…

微信同声传译小程序插件使用教程

微信同声传译小程序插件 —— 机器翻译、智能语音 案例可搜索“一起学英语鸭”小程序查看&#xff0c; 实现效果如下图&#xff1a; 插件功能 语音转文字 语音合成 文本翻译 step 1&#xff1a;添加插件 在使用前&#xff0c;需要登录官网 设置 → 第三方服务 → 添加插件…