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

2023-09-23力扣每日一题

链接:

1993. 树上的操作

题意

  • **Lock:**指定用户给指定节点 上锁 ,上锁后其他用户将无法给同一节点上锁。只有当节点处于未上锁的状态下,才能进行上锁操作。
  • **Unlock:**指定用户给指定节点 解锁 ,只有当指定节点当前正被指定用户锁住时,才能执行该解锁操作。
  • Upgrade:指定用户给指定节点 上锁 ,并且将该节点的所有子孙节点 解锁 。只有如下 3 个条件全部满足时才能执行升级操作:
    • 指定节点当前状态为未上锁。
    • 指定节点至少有一个上锁状态的子孙节点(可以是 任意 用户上锁的)。
    • 指定节点没有任何上锁的祖先节点。

基础的类设计,用到的是递归/dfs

可以用递归优化子节点的查询,同时把修改子节点的值

 bool check2(int num){bool ans=false;for(auto s:son[num]){ans |= book[s]!=0;book[s]=0;ans |= check2(s);}return ans;}

实际代码:

class LockingTree {
public:vector<int>parent;vector<vector<int>>son;vector<int>book;LockingTree(vector<int>& parent) {this->parent=parent;book.resize(parent.size());son.resize(parent.size());for(int i=0;i<parent.size();i++){if(parent[i]>=0){son[parent[i]].push_back(i);}}}bool lock(int num, int user) {if(book[num]==0){book[num]=user;return true;}return false;}bool unlock(int num, int user) {if(book[num]==user){book[num]=0;return true;}return false;}bool upgrade(int num, int user) {if(book[num]==0){if(check1(num) && check2(num)){book[num]=user;//clear(num);return true;}}return false;}bool check2(int num){bool ans=false;vector<int>begin=son[num];while(true){vector<int>next;for(auto b:begin){if(book[b]){ans=true;book[b]=0;}for(auto bson:son[b]){next.push_back(bson);}}if(next.empty()) break;begin=next;}return ans;}bool check1(int num){while(parent[num]!=-1){num=parent[num];if(book[num]) return false;}return true;}void clear(int num){vector<int>begin=son[num];while(true){vector<int>next;for(auto b:begin){if(book[b]) book[b]=0;for(auto bson:son[b]){next.push_back(bson);}}if(next.empty()) break;begin=next;}}
};/*** Your LockingTree object will be instantiated and called as such:* LockingTree* obj = new LockingTree(parent);* bool param_1 = obj->lock(num,user);* bool param_2 = obj->unlock(num,user);* bool param_3 = obj->upgrade(num,user);*/

限制:

  • n == parent.length
  • 2 <= n <= 2000
  • 对于 i != 0 ,满足 0 <= parent[i] <= n - 1
  • parent[0] == -1
  • 0 <= num <= n - 1
  • 1 <= user <= 104
  • parent 表示一棵合法的树。
  • lockunlockupgrade 的调用 总共 不超过 2000 次。
http://www.lryc.cn/news/174934.html

相关文章:

  • C#中使用Newtonsoft.Charp实现Json对象序列化与反序列化
  • Golang开发--互斥锁和读写锁
  • Springboot 集成WebSocket作为客户端,含重连接功能,开箱即用
  • java调整字符串
  • 2023-9
  • 软考高级+系统架构设计师教程+第二版新版+电子版pdf
  • 【产品运营】如何提升B端产品竞争力(下)
  • uniapp 微信小程序使用echarts
  • 【漏洞复现】企望制造 ERP命令执行
  • 2023 “华为杯” 中国研究生数学建模竞赛(E题)深度剖析|数学建模完整代码+建模过程全解全析
  • 【腾讯云国际站】CDN内容分发网络特性介绍
  • 【工业机器人视觉】
  • 跨域(浏览器)
  • Leetcode 2866. Beautiful Towers II
  • 电脑C盘爆红怎么办?(小白篇)
  • Office Xml 2003转XLSX
  • skyWalking搭建(一)
  • Golang开发--sync.WaitGroup
  • Linux命令教程:使用cat命令查看和处理文件
  • Websocket集群解决方案以及实战(附图文源码)
  • 科技的成就(五十一)
  • Tomcat8 任意写文件PUT方法 (CVE-2017-12615)
  • SAP服务器修改主机名操作手册
  • 【大数据】Doris 构建实时数仓落地方案详解(一):实时数据仓库概述
  • C++ list容器的实现及讲解
  • 前端项目练习(练习-002-NodeJS项目初始化)
  • C++QT day11
  • Stable DIffusion 炫酷应用 | AI嵌入艺术字+光影光效
  • C#通过重写Panel改变边框颜色与宽度的方法
  • Vue2+ElementUI 静态首页案例