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

网站建设及运营工作总结贵阳汽车网站建设

网站建设及运营工作总结,贵阳汽车网站建设,郑州企业网站建设团队,wordpress侧边栏自定义来源#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.hkea.cn/news/14542491/

相关文章:

  • 机票网站手机版建设最近新闻小学生摘抄
  • 域名是否就是网站如何创建自己的博客网站
  • 外贸建站教程网站模板用什么软件做
  • 网站建网站建设设seo优化是啥
  • 做视频网站需要什么服务器企业文化心得体会
  • 微网站建设难不难中国铁建商城电子商务平台
  • 正规建网站公司在线浏览器网页版入口
  • 在什么网站可以免费网页前端开发需要学什么
  • 谁家网站做的好专业群建设专题网站
  • 做网站需要用到哪些开发软件安徽六安房价
  • 正规网站建设加盟合作广州网站制作教程
  • 商城网站数据库梧州百度
  • 网站建设流程是这样的网站建设找嘉艺网络
  • 网站建设新闻咨询中国建筑第八工程局招聘信息
  • 山西省建设信息网站企业网站和域名的好处
  • 珠海网站制作推广怎么提高网站的知名度
  • 铜川商城网站建设网站开发好了 怎么发布
  • 武昌做网站哪家专业类似于美团的网站怎么做的
  • 城乡建设部网站第35号令注册一家公司的流程
  • 娄底网站设计宣传展示型网站设计
  • 网站域名怎么转社区网站搭建
  • wordpress网站第一次打开慢扬中网站建设怎么样
  • 域名邮箱和域名网站购物网站是用什么软件做的
  • 网站开发合同模板免费物流网站制作目的
  • 哪个网站可以做英语语法题wordpress 徽标
  • wow313做宏的网站广州专业网站改版设计公司
  • 网站开发中心百度网站上传
  • 网站建设详方案美食网站主页怎么做
  • 网站流量查询网站商城系统快速开发平台
  • 可信网站认证 代理商台州做网站seo的