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

*算法训练(leetcode)第二十七天 | 56. 合并区间、738. 单调递增的数字、968. 监控二叉树

刷题记录

  • 56. 合并区间
  • *738. 单调递增的数字
  • *968. 监控二叉树

56. 合并区间

leetcode题目地址

排序后遇到有重合的区间选择最大的区间保存即可,结果集中保存的是离当前区间最近的区间,因此使用当前区间与结果集中的最后一个集合比较查看是否有重合,若有重合则将右区间扩大为两个区间中最大的右区间,若没有重合则将当前集合放入结果集中。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

// c++
class Solution {
public:static bool cmp(const vector<int> & a, const vector<int> & b){if(a[0]==b[0]) return a[1] > b[1];return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;sort(intervals.begin(), intervals.end(), cmp);for(int i=0; i<intervals.size(); i++){if(result.size()>0){int last = result.size()-1;if(intervals[i][0]<=result[last][1])result[last][1] = max(result[last][1], intervals[i][1]);else{result.emplace_back(intervals[i]);}}else{result.emplace_back(intervals[i]);}}return result;}
};

*738. 单调递增的数字

leetcode题目地址

一开始想着暴力求解,但超时了,然后就没思路了。

思路来源

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

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

*968. 监控二叉树

leetcode题目地址

借助后序遍历,每个结点三种状态:无覆盖、有监控、被覆盖,分别用0、1、2标识。

  • 若孩子节点都是被覆盖,则当前节点没有被覆盖,返回0;
  • 若孩子节点有一个未被覆盖,则当前节点需要加装监控,计数器+1,返回1;
  • 若孩子节点有一个装了监控,则当前节点是被覆盖的状态,返回2;

空节点需要返回被覆盖状态,即2。
因为空节点的父结点可能是叶结点,若返回无覆盖状态,则会把监控装在叶结点,而正确的位置应该装在叶结点的父节点;若返回有监控,则会导致单分支节点未被覆盖。因此只能返回2.

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// c++
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*//*
三种状态:
无覆盖:0
当前节点有摄像头:1
当前节点有被覆盖:2
*/
class Solution {
public:int Traverse(TreeNode* root, int &result){if(!root) return 2;int left = Traverse(root->left, result);int right = Traverse(root->right, result);// 左右节点有一个未被覆盖 则当前节点需要加摄像头if(!left || !right){result++;return 1;}// 左右节点有监控 则当前节点被覆盖if(left == 1 || right == 1){return 2;}// 子节点都是覆盖 则当前节点未被覆盖if(left==2 && right==2) {return 0;}return -1;}int minCameraCover(TreeNode* root) {int result = 0;int res = Traverse(root, result);// 根节点未被覆盖if(!res) result++;return result;}
};
http://www.lryc.cn/news/397013.html

相关文章:

  • OpenJudge 奇数求和
  • 【排序 - 快速排序】
  • pytest使用报错(以及解决pytest所谓的“抑制print输出”)
  • 开源项目编译harbor arm架构的包 —— 筑梦之路
  • [笔记] SKF Enveloping FAQ 用户指南
  • 宪法学学习笔记(个人向) Part.3
  • 联想拯救者Y7000 IRX9 笔记本接口功能介绍
  • 【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网
  • MD5加密和注册页面的编写
  • 【Android组件】封装加载弹框
  • Spring源码二十:Bean实例化流程三
  • 前端导出文件时,后端代码出错如何将错误信息返回给前端展示
  • 解决Spring Boot应用中的内存优化问题
  • shark云原生-日志体系-filebeat高级配置(适用于生产)-更新中
  • 响应式设计的双璧:WebKit 支持 CSS Flexbox 和 Grid 布局深度解析
  • Linux软件包管理
  • 如何分辨AI生成的内容?AI生成内容检测工具对比实验
  • Clion中怎么切换不同的程序运行
  • 【C++初阶】C++入门(下)
  • 【3】迁移学习模型
  • 【工具分享】FOFA——网络空间测绘搜索引擎
  • [嵌入式 C 语言] 按位与、或、取反、异或
  • Android --- 运行时Fragment如何获取Activity中的数据,又如何将数据传递到Activity中呢?
  • Java后端开发(十三)-- Java8 stream的 orElse(null) 和 orElseGet(null)
  • L2 LangGraph_Components
  • 09.C2W4.Word Embeddings with Neural Networks
  • 硅谷甄选二(登录)
  • scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别
  • 简谈设计模式之建造者模式
  • 力扣 hot100 -- 动态规划(下)