【力扣每日一题】2023.9.23 树上的操作

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

这是一道程序设计类的题目,题目比较长,我稍微概括一下。

构造函数中给我们一个数组,第i个元素表示第i个节点的父节点,让我们以此数组来构造一棵树(不是二叉树)。

类中有三个成员函数,第一个是上锁函数,给我们一个节点值以及一个用户ID,让我们对节点以用户的名义上锁,前提是这个节点没上锁。

第二个是解锁函数,给我们一个节点值和一个用户ID,让我们把这个节点解锁,前提是这个节点之前已经上锁,并且是同一个用户ID上锁的。

第三个是升级函数,给我们节点值和用户ID,要我们把这个节点上锁,并且把这个节点的所有子孙节点都解锁。前提是这个节点的祖先节点没有一个上锁的,并且这个节点的子孙节点至少有一个上锁的。

我们来逐个击破,首先是上锁函数,我们只需要拿一个数组来存放上锁关系即可,这个数组的第i个元素表示给节点i上锁的用户,如果是-1则表示这个节点没有上锁。

解锁函数也类似,我们只需要查看给节点上锁的用户是不是当前用户即可。

最后剩下升级函数,一共是三个条件。

第一个是当前节点未上锁,这个好办,我们查询上诉关系数组就行。

第二个是查询子孙节点,要求子孙节点至少有一个上锁,要用到节点的父子关系了,所以我们在构造函数的时候就构建出节点的父子关系,拿一个map来存放每个节点的子节点就行。

寻找子孙节点的时候我们使用递归函数去查询,我使用的是DFS,找哪怕一个上锁的节点我们都返回true表示子孙节点有上锁的,但是我们不是立即返回,因为这个升级函数还要我们把上锁的子孙节点都解锁,因此我们还需要接着往下寻找子孙节点,遇到上锁的我们就解锁。

第三个条件是祖先节点没有上锁的,由于每个节点只会有一个父节点,因此我们不断向上去寻找祖先节点即可,遇到上锁的就返回false。

最后三个条件都满足了,我们再将这个节点以当前用户的名义上锁。

代码:

class LockingTree {
public:unordered_map<int,vector<int>>sons;     //记录每个节点的子节点vector<int>parent;                      //记录每个节点的父亲vector<int>whoLock;                     //记录每个节点的上锁情况LockingTree(vector<int>& parent):parent(parent),whoLock(vector<int>(parent.size(),-1)) {//构建子节点的关系for(int i=0;i<parent.size();i++){if(sons.find(parent[i])==sons.end()) sons[parent[i]]=vector<int>(0);sons[parent[i]].push_back(i);}}bool lock(int num, int user) {//如果该节点已经上过锁那么不能上锁,反之可以并且修改上锁人if(whoLock[num]!=-1) return false;whoLock[num]=user;return true;}bool unlock(int num, int user) {//如果该节点没有被该用户上锁,那么不能解锁,反之解锁if(whoLock[num]!=user) return false;whoLock[num]=-1;return true;}//寻找某节点的父节点是否上锁bool find(int num){if(num==-1) return true;if(whoLock[num]!=-1) return false;return find(parent[num]);}//寻找子节点是否上锁,如果上锁,那么解锁bool unlockSon(int num){bool flag=false;if(whoLock[num]!=-1){flag=true;whoLock[num]=-1;} for(auto son:sons[num]){if(unlockSon(son)) flag=true;}return flag;}bool upgrade(int num, int user) {//如果该节点已经锁上了那么不能上锁if(whoLock[num]!=-1) return false;//如果有上锁的祖先节点那么不能上锁 if(!find(parent[num])) return false;//如果子孙节点没有一个上锁的,那么不能上锁if(!unlockSon(num)) return false;//一切没问题上锁whoLock[num]=user;return true;}
};

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

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

相关文章

最新Python大数据之Excel进阶

文章目录 Excel图表类型了解有哪些图表类型 Excel图表使用图表的创建方式利用固定数据区域创建图表编辑数据系列添加数据标签格式化图表 Excel数据透视表数据透视表对原始数据的要求创建数据透视表数据透视表字段布局将数据透视图变成普通图表 Excel图表类型 为了揭示数据规律…

如何模拟自然界生态系统中的食物链

本人最近在研究一款针对青少年儿童的教育游戏&#xff0c;希望从培养孩子各方面的综合素质出发&#xff0c;引导孩子掌握多方面的软知识&#xff0c;软技能。其中有一个比较新颖的游戏玩法------打猎。该玩法创新点在于&#xff0c;引入了食物链的概念。过去一般的游戏里&#…

时间复杂度、空间复杂度

一、时间复杂度 1、概念 时间复杂度&#xff1a;计算的是当一个问题量级增加的时间&#xff0c;时间增长的趋势&#xff1b; O&#xff08;大O表示法&#xff09;&#xff1a;渐进的时间复杂度 2、举例 ① 以下 for 循环的时间复杂度&#xff1a;O(1 3n) O(n) 去掉常数…

查看吾托帮88.47的docker里的tomcat日志

步骤如下 &#xff08;1&#xff09;ssh &#xff08;2&#xff09;ssh root192.168.88.47 等待输入密码&#xff1a;fytest &#xff08;3&#xff09;pwd #注释&#xff1a;输出/root &#xff08;4&#xff09;docker exec -it wetoband_deploy /bin/bash #注释&#xff1…

nginx实现反向代理实例

1 前言 1.1 演示内容 在服务器上访问nginx端口然后跳转到tomcat服务器 1.2 前提条件 前提条件&#xff1a;利用docker安装好nginx、tomcat、jdk8&#xff08;tomcat运行需要jdk环境&#xff09; 只演示docker安装tomcat&#xff1a; 默认拉取最新版tomcat docker pull t…

【vue2第二十章】vuex使用 (state,mutations,actions,getters)

vuex是什么&#xff1f; Vuex是一个用于Vue.js应用程序的状态管理模式。它允许您在应用程序中管理共享状态&#xff0c;并以可预测的方式进行状态更新。Vuex集成了Vue的响应式系统&#xff0c;使得状态的变化能够自动地更新视图。使用Vuex&#xff0c;您可以将应用程序的状态集…

【论文阅读 07】Anomaly region detection and localization in metal surface inspection

比较老的一篇论文&#xff0c;金属表面检测中的异常区域检测与定位 总结&#xff1a;提出了一个找模板图的方法&#xff0c;使用SIFT做特征提取&#xff0c;姿态估计看差异有哪些&#xff0c;Hough聚类做描述符筛选&#xff0c;仿射变换可视化匹配图之间的关系&#xf…

如何使用ArcGIS Pro自动矢量化道路

对于已经制作好的电子地图&#xff0c;我们可以通过像素识别的方式将其中的要素提取出来&#xff0c;比如本教程要讲到的道路数据&#xff0c;这里为大家介绍一下在ArcGIS Pro中如何自动矢量化道路&#xff0c;希望能对你有所帮助。 栅格计算 在工具箱中点击“Spatial Analys…

【AIGC】Llama2-7B-Chat模型微调

环境 微调框架&#xff1a;LLaMA-Efficient-Tuning 训练机器&#xff1a;4*RTX3090TI (24G显存) python环境&#xff1a;python3.8, 安装requirements.txt依赖包 一、Lora微调 1、准备数据集 2、训练及测试 1&#xff09;创建模型输出目录 mkdir -p models/llama2_7b_chat…

unity gb28181 rtsp 视频孪生图像拉流和矫正插件(一)

目的是为了视频孪生&#xff0c;将视频放到三维里面&#xff0c;如果使用自己写的插件&#xff0c;有更好的灵活性&#xff0c;同时断线重连等等都更好控制了。 1、矫正算法和硬件解码 最好使用opencv制作&#xff0c;可以使用opencv的cuda加速&#xff0c;opencv的编译&…

面试题:RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费?

文章目录 1、消息整体处理过程Producer发送消息阶段手段一&#xff1a;提供SYNC的发送消息方式&#xff0c;等待broker处理结果。手段二&#xff1a;发送消息如果失败或者超时&#xff0c;则重新发送。手段三&#xff1a;broker提供多master模式&#xff0c;即使某台broker宕机…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

基于Yolov8的野外烟雾检测(2):多维协作注意模块MCA,效果秒杀ECA、SRM、CBAM等 | 2023.9最新发布

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.MCA介绍 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前…

【Vue】vue-cli一站式搭建SPA项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

Python:获取当前目录下所有文件夹名称及文件夹下所有文件名称

获取当前目录下所有文件夹名称 def get_group_list(folder_path):group_list []for root, dirs, files in os.walk(folder_path):for dir in dirs:group_list.append(dir)return group_list获取文件夹下所有文件名称 def get_file_list(folder_path, group_name):file_list …

[Linux入门]---进程的概念

文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候&#xff0c;操作系统会被加载到内存中&#xff0c;点击多个应用进行时&a…

机器学习第十四课--神经网络

总结起来&#xff0c;对于深度学习的发展跟以下几点是离不开的: 大量的数据(大数据)计算资源(如GPU)训练方法(如预训练) 很多时候&#xff0c;我们也可以认为真正让深度学习爆发起来的是数据和算力&#xff0c;这并不是没道理的。 由于神经网络是深度学习的基础&#xff0c;学…

基于SSM的高校图书馆个性化服务的设计与实现(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的高校图书馆个性化服务的设计与实现&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过S…

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号&#xff08; &am…

GaussDB数据库SQL系列-定义重载函数

目录 一、前言 二、函数重载的定义 三、GaussDB创建自定义函数的事项说明 四、GaussDB数据库中的自定义函数示例 示例一&#xff1a;创建package属性重载函数&#xff0c;根据不同的SQL条件获取生成视图 示例二&#xff1a;创建package属性重载函数&#xff0c;根据不同的…