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

一刷代码随想录(贪心5)

56. 合并区间

题意:

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

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

解法:同之前的三道题,主要是判断区间是否重叠,可以首先将第一个区间存入结果,判断重叠就更新右边界即可,由于是按左边界排序的,那么存入结果数组的左边界必然是最小的不用更新。

代码:

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;}
};

求最大整数

题意:

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

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

示例 1:

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

示例 2:

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

示例 3:

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

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

解法:要求是单调递增还要求最大,那么若发现高位低于低位,将高位减一,低位就可以赋为9,这样让这一小部分达到最大,按照贪心思路,一步步往下做即可,就会退出全局最优,遍历应该从低位到高位,否则可能导致,判断好的位置又因为下面的变化改成了不符合题意的情况,因为从前往后遍历会导致下一个值变小,会破坏其递增条件。

代码:

class Solution {
public:int monotoneIncreasingDigits(int N) {string strNum = to_string(N);// flag用来标记赋值9从哪里开始// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行int flag = strNum.size();for (int i = strNum.size() - 1; i > 0; i--) {if (strNum[i - 1] > strNum[i] ) {flag = i;strNum[i - 1]--;}}for (int i = flag; i < strNum.size(); i++) {strNum[i] = '9';}return stoi(strNum);}
};

968.监控二叉树

题意:

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

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

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

示例 1:

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

示例 2:

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

解法:将摄像头放在两个节点中间,从叶子节点的父节点开始,每隔开两个放一个摄像头即可,最后还要判断头结点并放摄像头,由于要从叶子节点开始,因此应该使用后序遍历以满足条件,同时对于每个节点都有三种情况,覆盖、摄像头、没有覆盖。通过左右孩子的状态判断属于那种情况,并返回对应的数字即可.

代码:

// 版本一
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;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ChatGPT:GPT,GPT2,GPT3,Prompt
  • 请转告HPC计算AI计算单位,选对存储事半功倍
  • 元气森林|每天拆解一个品牌营销方案
  • 根据《广东省政务服务数字化条例》规定,政务服务数字化,是指将___广泛应用于政务服务,推动政务服务更加智能、便捷、高效的活动。()
  • JavaScript (十)——JavaScript 比较 和 逻辑运算符
  • 河南萌新联赛2024第(三)场:河南大学
  • C语言程序设计23
  • 【MySQL】用户管理连接池原理{数据库权限/连接池/mysql访问逻辑}
  • 【计算机毕业设计】​720图书馆智能选座系统
  • Java | Leetcode Java题解之第312题戳气球
  • 操作系统_内存管理学习心得
  • Mojo编程语言与云服务及微服务架构的协同之道
  • K8S 卸载旧版本安装其他版本
  • Win10系统,使用钉钉会议共享屏幕的时候,别人看到的都是全黑或全白屏幕
  • LabVIEW 使用 I/O 服务器
  • 2017 年终总结 —— 在路上
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Laravel核心解读--Facades
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • mysql外键的使用
  • Python - 闭包Closure
  • python 学习笔记 - Queue Pipes,进程间通讯
  • quasar-framework cnodejs社区
  • Redis 懒删除(lazy free)简史
  • VUE es6技巧写法(持续更新中~~~)
  • vue学习系列(二)vue-cli
  • 安卓应用性能调试和优化经验分享
  • 番外篇1:在Windows环境下安装JDK
  • 基于HAProxy的高性能缓存服务器nuster
  • 如何编写一个可升级的智能合约
  • 入门到放弃node系列之Hello Word篇
  • 深度学习中的信息论知识详解
  • 一道闭包题引发的思考
  • 用 Swift 编写面向协议的视图
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #14vue3生成表单并跳转到外部地址的方式
  • (Note)C++中的继承方式
  • (Ruby)Ubuntu12.04安装Rails环境
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (苍穹外卖)day03菜品管理
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .aanva
  • .net dataexcel winform控件 更新 日志
  • .NET6 命令行启动及发布单个Exe文件
  • .net的socket示例
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [2023-年度总结]凡是过往,皆为序章
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...