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

海口快速建站公司推荐高端网站 设计

海口快速建站公司推荐,高端网站 设计,网上怎么找人去推广广告,网络服务遇到问题 小爱音箱来源#xff1a;力扣#xff08;LeetCode#xff09; 描述#xff1a; 给你一棵 n 个节点的树#xff0c;编号从 0 到 n - 1 #xff0c;以父节点数组 parent 的形式给出#xff0c;其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点#xff0c;所以 par…来源力扣LeetCode 描述 给你一棵 n 个节点的树编号从 0 到 n - 1 以父节点数组 parent 的形式给出其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点所以 parent[0] -1 因为它没有父节点。你想要设计一个数据结构实现树里面对节点的加锁解锁和升级操作。 数据结构需要支持如下函数 Lock 指定用户给指定节点 上锁 上锁后其他用户将无法给同一节点上锁。只有当节点处于未上锁的状态下才能进行上锁操作。Unlock 指定用户给指定节点 解锁 只有当指定节点当前正被指定用户锁住时才能执行该解锁操作。Upgrade 指定用户给指定节点 上锁 并且将该节点的所有子孙节点 解锁 。只有如下 3 个条件 全部 满足时才能执行升级操作 指定节点当前状态为未上锁。指定节点至少有一个上锁状态的子孙节点可以是 任意 用户上锁的。指定节点没有任何上锁的祖先节点。 请你实现 LockingTree 类 LockingTree(int[] parent) 用父节点数组初始化数据结构。lock(int num, int user) 如果 id 为 user 的用户可以给节点 num 上锁那么返回 true 否则返回 false 。如果可以执行此操作节点 num 会被 id 为 user 的用户 上锁 。unlock(int num, int user) 如果 id 为 user 的用户可以给节点 num 解锁那么返回 true 否则返回 false 。如果可以执行此操作节点 num 变为 未上锁 状态。upgrade(int num, int user) 如果 id 为 user 的用户可以给节点 num 升级那么返回 true 否则返回 false 。如果可以执行此操作节点 num 会被 升级 。 示例 1 输入 [LockingTree, lock, unlock, unlock, lock, upgrade, lock] [[[-1, 0, 0, 1, 1, 2, 2]], [2, 2], [2, 3], [2, 2], [4, 5], [0, 1], [0, 1]] 输出 [null, true, false, true, true, true, false]解释 LockingTree lockingTree new LockingTree([-1, 0, 0, 1, 1, 2, 2]); lockingTree.lock(2, 2); // 返回 true 因为节点 2 未上锁。// 节点 2 被用户 2 上锁。 lockingTree.unlock(2, 3); // 返回 false 因为用户 3 无法解锁被用户 2 上锁的节点。 lockingTree.unlock(2, 2); // 返回 true 因为节点 2 之前被用户 2 上锁。// 节点 2 现在变为未上锁状态。 lockingTree.lock(4, 5); // 返回 true 因为节点 4 未上锁。// 节点 4 被用户 5 上锁。 lockingTree.upgrade(0, 1); // 返回 true 因为节点 0 未上锁且至少有一个被上锁的子孙节点节点 4。// 节点 0 被用户 1 上锁节点 4 变为未上锁。 lockingTree.lock(0, 1); // 返回 false 因为节点 0 已经被上锁了。提示 n parent.length2 n 2000对于 i ! 0 满足 0 parent[i] n - 1parent[0] -10 num n - 11 user 104parent 表示一棵合法的树。lock unlock 和 upgrade 的调用 总共 不超过 2000 次。 方法深度优先搜索 思路 按照题目要求依次实现各个函数即可 Lock可以用一个数组变量 lockNodeUser 记录给各个节点上锁的用户lockNodeUser[num] 即表示给节点 num 上锁的用户。当lockNodeUser[num] −1 时即表示 节点 num 未被上锁通过给 lockNodeUser[num] 赋值实现上锁。Unlock通过比较变量 lockNodeUser[num] 和 user 是否先等来判断当前节点是否可以解锁通过赋值来解锁。Upgrade实现较为复杂首先需要判断三个条件是否同时成立如果是还需要给指定节点上锁并且给它的所有子孙节点解锁。三个条件中 指定节点当前状态为未上锁通过变量 lockNodeUser 来判断。指定节点没有任何上锁的祖先节点需要依次遍历当前节点的父亲节点通过变量 lockNodeUser 和 parent 来判断。具体代码中我们利用一个函数 hasLockedAncestor 来实现这一判断。指定节点至少有一个上锁状态的子孙节点我们将这一判断放到第三步来进行使得它可以和「给它的所有子孙节点解锁」同时实现。三个状态的判断我们用「短路与」来连接当只有前两步都为真才会进行第三步。当第三步也为真那么我们就需要进行「给它的所有子孙节点解锁」这一步当第三步为假就说明指定节点没有上锁的子孙节点那么我们仍可以进行「给它的所有子孙节点解锁」这一步并不影响树的状态。我们定义一个递归函数 checkAndUnlockDescendant 来实现这一步返回一个布尔值表示当前节点是否有上锁的子孙节点也包括自己同时将所有的子孙节点也包括自己解锁。遍历子孙节点时我们提前构建一个变量 children表示当前节点的孩子节点这一步可以在初始化时完成。 最后如果这三个条件与的结果为真将当前节点上锁。 代码 class LockingTree { public:LockingTree(vectorint parent) {int n parent.size();this-parent parent;this-lockNodeUser vectorint(n, -1);this-children vectorvectorint(n);for (int i 0; i n; i) {int p parent[i];if (p ! -1) {children[p].emplace_back(i);}}}bool lock(int num, int user) {if (lockNodeUser[num] -1) {lockNodeUser[num] user;return true;} return false;}bool unlock(int num, int user) {if (lockNodeUser[num] user) {lockNodeUser[num] -1;return true;}return false;}bool upgrade(int num, int user) {bool res lockNodeUser[num] -1 \ !hasLockedAncestor(num) \ checkAndUnlockDescendant(num);if (res) {lockNodeUser[num] user;}return res;}bool hasLockedAncestor(int num) {num parent[num];while (num ! -1) {if (lockNodeUser[num] ! -1) {return true;}num parent[num];}return false;}bool checkAndUnlockDescendant(int num) {bool res lockNodeUser[num] ! -1;lockNodeUser[num] -1;for (int child : children[num]) {res | checkAndUnlockDescendant(child);} return res;}private:vectorint parent;vectorint lockNodeUser;vectorvectorint children; };时间 328ms 击败 62.96%使用 C 的用户 内存 117.67MB 击败 94.44%使用 C 的用户 复杂度分析 时间复杂度初始化构建 children 消耗 O(n)Lock 和 Unlock 都消耗 O(1)Upgrade 消耗 O(n)。空间复杂度初始化消耗 O(n)Lock 和 Unlock 都消耗 O(1)Upgrade 消耗 O(n)。 author力扣官方题解
http://www.w-s-a.com/news/802880/

相关文章:

  • 网站建设了解眉山网站优化
  • 做网站用php还是node如何申请网站域名流程
  • 销售公司怎么做网站删除wordpress
  • 毕节网站怎么做seohtml代码特效银河系
  • 淄博品质网站建设网站引导页案例
  • 网站建设虚拟空间小豹子韬韬是哪个网站做的
  • 网络司网站如何建立公司网站建议和规则
  • 织梦网站模板后台密码找回企业vi设计公司性价比高
  • php 爬取网站所有链接传奇手游发布网站
  • 免费软文网站wordpress中文名注册
  • 企业网站建设研究目的意义怎样设计一个公司网站
  • 怎么架构网站便民信息发布平台
  • 网站 建设 现状网站推广合同需要缴纳印花税吗
  • 熊猫头表情包制作网站wordpress 缺省目录
  • 网站浏览图片怎么做的群晖wordpress升级5.0
  • 25个优秀个人网站设计模板网站建设定位分析论文
  • 在线网站备案站长seo综合查询工具
  • 网站根 html网站建设行业数据
  • 网站公司做的网站有最字设计说明室内设计
  • 在线网站代码生成我想做个百度网站怎么做
  • 网站的建设费用分为长治市建设厅官方网站
  • 做网站都有哪些费用建设免费手机网站
  • 网站 组成代码做网站图片怎么插
  • 2020中国企业500强榜单南宁seo标准
  • 北美购物网站排名烟台专业的网站建站公司
  • 门户网站设计特点营销策划咨询机构
  • 天津做网站就到徽信xiala5中国营销型网站
  • 外汇网站建设制作深圳三站合一网站建设
  • 深圳坂田网站设计公司有哪些学校网站建设管理办法
  • 太原建设银行网站中山营销型网站设计