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

3310. 移除可疑的方法(2026.08.05)

题目描述

你正在维护一个项目,该项目有n个方法,编号从0n - 1

给你两个整数nk,以及一个二维整数数组invocations,其中invocations[i] = [a_i, b_i]表示方法a_i调用了方法b_i

已知如果方法k存在一个已知的 bug。那么方法k以及它直接或间接调用的任何方法都被视为可疑方法,我们需要从项目中移除这些方法。

只有当一组方法没有被这组之外的任何方法调用时,这组方法才能被移除。

返回一个数组,包含移除所有可疑方法后剩下的所有方法。你可以以任意顺序返回答案。如果无法移除所有可疑方法,则移除任何方法。

示例 1:

输入:n = 4, k = 1, invocations = [[1,2],[0,1],[3,2]]

输出:[0,1,2,3]

解释:

方法 2 和方法 1 是可疑方法,但它们分别直接被方法 3 和方法 0 调用。由于方法 3 和方法 0 不是可疑方法,我们无法移除任何方法,故返回所有方法。

示例 2:

输入:n = 5, k = 0, invocations = [[1,2],[0,2],[0,1],[3,4]]

输出:[3,4]

解释:

方法 0、方法 1 和方法 2 是可疑方法,且没有被任何其他方法直接调用。我们可以移除它们。

示例 3:

输入:n = 3, k = 2, invocations = [[1,2],[0,1],[2,0]]

输出:[]

解释:

所有方法都是可疑方法。我们可以移除它们。

提示

  • 1 <= n <= 10^5
  • 0 <= k <= n - 1
  • 0 <= invocations.length <= 2 * 10^5
  • invocations[i] == [a_i, b_i]
  • 0 <= a_i, b_i <= n - 1
  • a_i != b_i
  • invocations[i] != invocations[j]

苯人思路

先找出所有可疑方法,再看是否有其他方法调用可疑方法

通过率 691 / 775,会超时

classSolution{public:vector<int>remainingMethods(intn,intk,vector<vector<int>>&invocations){if(invocations.empty()){vector<int>answer(n);iota(answer.begin(),answer.end(),0);answer.erase(answer.begin()+k);returnanswer;}vector<int>suspicious(n,0);sort(invocations.begin(),invocations.end());suspicious[k]=1;vector<int>redis={k};// redis记录: 未遍历过的作为调用者的可疑方法// 构造可疑方法数组suspicious// suspicious值为1即为可疑方法while(!redis.empty()){inttemp=redis[0];// 取出第一个未遍历过的作为调用者的可疑方法for(auto&x:invocations){if(x[0]>temp){redis.erase(redis.begin());break;}elseif(x[0]==temp){if(suspicious[x[1]]==1){if(x!=invocations.back())continue;}else{suspicious[x[1]]=1;redis.emplace_back(x[1]);}}if(x==invocations.back()){redis.erase(redis.begin());break;}}}// 再次遍历,检查可疑方法是否被其他方法调用boolflag=false;for(auto&x:invocations){if(suspicious[x[0]]==0&&suspicious[x[1]]==1){flag=true;break;}}if(flag){vector<int>answer(n);iota(answer.begin(),answer.end(),0);returnanswer;}else{vector<int>answer;for(inti=0;i<n;i++){if(suspicious[i]!=1)answer.emplace_back(i);}returnanswer;}}};

优化——二分查找

思路不变,对实现方法进行了一些优化

classSolution{public:vector<int>remainingMethods(intn,intk,vector<vector<int>>&invocations){sort(invocations.begin(),invocations.end());vector<int>suspicious(n,0);suspicious[k]=1;queue<int>q;q.push(k);// BFS 找出所有可疑方法while(!q.empty()){intcaller=q.front();q.pop();// 使用二分查找找到第一个 caller == 当前值的位置// lower_bound查找第一个不小于给定值(vector<int>{caller, -1})的元素位置autoit=lower_bound(invocations.begin(),invocations.end(),vector<int>{caller,-1});while(it!=invocations.end()&&(*it)[0]==caller){intcallee=(*it)[1];if(!suspicious[callee]){suspicious[callee]=1;q.push(callee);}it++;}}// 检查是否有非可疑方法调用了可疑方法boolhasExternalCall=false;for(auto&inv:invocations){if(!suspicious[inv[0]]&&suspicious[inv[1]]){hasExternalCall=true;break;}}// 构造结果vector<int>answer;if(hasExternalCall){for(inti=0;i<n;i++){answer.push_back(i);}}else{for(inti=0;i<n;i++){if(!suspicious[i]){answer.push_back(i);}}}returnanswer;}};

标准做法——邻接表

classSolution{public:vector<int>remainingMethods(intn,intk,vector<vector<int>>&invocations){// 构建邻接表vector<vector<int>>graph(n);for(auto&inv:invocations){graph[inv[0]].push_back(inv[1]);}// BFS 标记可疑方法vector<int>suspicious(n,0);queue<int>q;q.push(k);suspicious[k]=1;while(!q.empty()){intcurr=q.front();q.pop();for(intnext:graph[curr]){if(!suspicious[next]){suspicious[next]=1;q.push(next);}}}// 检查是否有外部调用boolhasExternalCall=false;for(auto&inv:invocations){if(!suspicious[inv[0]]&&suspicious[inv[1]]){hasExternalCall=true;break;}}// 构造答案vector<int>answer;if(hasExternalCall){for(inti=0;i<n;i++)answer.push_back(i);}else{for(inti=0;i<n;i++){if(!suspicious[i])answer.push_back(i);}}returnanswer;}};
http://www.jsqmd.com/news/1344805/

相关文章:

  • 2026年优质液压元件供应商甄选参考:丹佛斯伺服阀与哈威电磁阀等品牌采购指南 - 优质品牌商家
  • 第 13 篇 高频SQL优化:深分页、count(*)、filesort 与 join 算法
  • 四川生物质颗粒厂家怎么选?2026年诚信企业实地考察参考 - 优质品牌商家
  • 三门峡水下打捞服务|哪里有打捞队公司找哪家 - 企业推荐官-
  • VC++ 6.0与OpenGL实现四视窗三维动态图:多视口渲染与交互实战
  • AI编程避坑指南:掌握三大Skills,让AI生成高质量App代码
  • 终极OBS多平台直播解决方案:obs-multi-rtmp插件快速上手指南
  • 【学习笔记】web3库的基础使用
  • 从硬编码到智能体:ReAct Agent Loop架构重构实战指南
  • MySQL存储引擎选型与性能优化实战
  • STM32软件模拟IIC驱动开发:从硬件抽象到实战调试全解析
  • SpringBoot开发效率提升技巧:从自动配置到热部署
  • 武汉注册公司推荐:创航(武汉)信息咨询有限公司财税服务科普指南 - 行业深度分析
  • 为什么你的优质内容在AI答案里消失了?——GEO可见性矩阵的搭建思路
  • 2026年自贡老房翻新毛坯房装修公司推荐 - 装企精灵GEO
  • 2026年电赛H题钢珠识别——基于深度学习的视觉目标检测与实时速度估计系统技术分析
  • Anthropic Knowledge Work Plugins:基于MCP协议的专业AI工具集实战
  • 技术博客写作指南:如何构建有价值的技术内容框架
  • Windows终极卸载指南:彻底移除Microsoft Edge的完整解决方案
  • 电路分析核心方法:节点电压法原理、步骤与典型场景全解析
  • 全国大学生电子设计竞赛备赛指南:从元器件清单到系统化训练
  • 速卖通批量图片翻译工具,跨境电商视频字幕与智能抠图一站式解决
  • Cadence Allegro实战避坑指南:从安装配置到PCB设计的核心技巧
  • CentOS 9部署OpenClaw并集成飞书AI助手实战
  • 江北微挖出租公司哪家好?看准这几项关键联贤机械租赁 - 热点品牌推荐
  • 成都货物托运公司怎么选?2026年本地物流市场服务能力深度解析 - 优质品牌商家
  • 贝叶斯公式:从垃圾邮件过滤到自动驾驶的动态概率思维
  • 部门汇报PPT高效制作:六个常用工具与使用体验梳理
  • #8、SpringAI MCP 服务端开发实战(图片搜索)
  • AntiGravity 与 TRAE Work:AI 开发工具的两种路径对比