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

2940 找到Alice和Bob可以相遇的建筑 (944/951)超时

class Solution {
public:vector<int> leftmostBuildingQueries(vector<int>& heights, vector<vector<int>>& queries) {//如果两个人一开始就在同一个建筑,返回当前数组下标//创建一个临时数组 最后返回它vector<int> v;for(int i=0;i<queries.size();i++){//如果两人下标相同  不超过heights长度if (queries[i][0] == queries[i][1]&&queries[i][0]<heights.size()){            v.push_back(queries[i][0]);  //同时进入到下一个分支 以后尽量少使用goto语句 容易造成意想不到的错误goto next;}else{//确定queries中更大的数 作为数组下标//greaterNum = ;//如果可以直接跳转到比较大的身上if(heights[max(queries[i][0],queries[i][1])]>heights[min(queries[i][0],queries[i][1])]){v.push_back(max(queries[i][0],queries[i][1]));goto next;}for(int j = max(queries[i][0],queries[i][1])+1;j<heights.size();j++){//此处出错 比较应该是比较更大的heights中的元素 而不是下标if(heights[j]>max(heights[queries[i][0]],heights[queries[i][1]])){v.push_back(j);goto next;}}}v.push_back(-1);
next:}return v;}
};     优化这段代码,让时间复杂度减小

 

是的,针对你的问题,可以考虑以下几种优化的方法来提高效率,尤其是当查询数量 mm 和建筑数量 nn 非常大的时候:

1. 单调栈(Monotonic Stack)

通过使用单调栈,你可以在 O(n)O(n) 的时间内预处理每个建筑右侧第一个比它高的建筑索引。具体步骤如下:

  • 遍历建筑数组 heights,使用一个栈来存储建筑索引。
  • 当遇到当前建筑比栈顶建筑高时,出栈并记录该建筑的“下一个更高建筑”的索引。

时间复杂度:预处理的时间复杂度为 O(n)O(n),每个查询的时间复杂度为 O(1)O(1),总时间复杂度为 O(n+m)O(n+m)。

2. 二分搜索

将建筑的高度存储为一个数组后,可以使用二分搜索来快速回答每个查询:

  • 预处理:将建筑高度排序。
  • 对于每个查询,使用二分搜索找到右侧第一个比较高的建筑。

时间复杂度:预处理 O(nlog⁡n)O(nlogn),每次查询 O(log⁡n)O(logn),总时间复杂度为 O(nlog⁡n+mlog⁡n)O(nlogn+mlogn)。

3. Segment Tree 或 Binary Indexed Tree

构造一个线段树或树状数组(Binary Indexed Tree),以支持快速的区间查询来寻找最大值。

  • 每个查询可以在 O(log⁡n)O(logn) 的时间复杂度内完成。
  • 预处理构造的时间复杂度为 O(n)O(n)。

时间复杂度:总时间复杂度仍然为 O(n+mlog⁡n)O(n+mlogn)。

4. 动态规划

如果建筑之间的关系可以通过某种逻辑规则进行构建,不妨考虑动态规划来保存已计算的结果,以避免重复计算。

5.总结:

以上这些方法都是在不同场景下的选择。最推荐的方法是使用单调栈,这种方式简单有效,并且可以在 O(n+m)O(n+m) 的时间复杂度中解决问题。根据具体的需求和数据特点,你可以选择最合适的方案。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Delphi 利用LiveBindings绑定JSON数据到列表控件
  • [CSS]一文掌握
  • 快速学会SpringBoot图形验证码生成:一步步教你打造安全验证
  • 参会记录|2024 中国多媒体大会
  • leetcode-vector
  • django如何更新数据库字段并与数据库保持同步?
  • Redis 单机和集群环境部署教程
  • React前端面试基础(一)
  • LeetCode:2110. 股票平滑下跌阶段的数目(数学 Java)
  • 【Rust光年纪】构建高效终端用户界面:Rust库全面解析
  • 【ARM】应用ArmDS移植最小FreeRTOS系统
  • Visual Studio 调试时加载符号慢
  • Web-server日志分析命令
  • Qt自定义TreeWidget,实现展开折叠按钮在右侧,且一条竖直线上对齐
  • 通过指令深入了解Linux 3
  • [译]前端离线指南(上)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • JAVA之继承和多态
  • js ES6 求数组的交集,并集,还有差集
  • js算法-归并排序(merge_sort)
  • LeetCode算法系列_0891_子序列宽度之和
  • nginx 配置多 域名 + 多 https
  • React+TypeScript入门
  • Spring Boot快速入门(一):Hello Spring Boot
  • springboot_database项目介绍
  • VuePress 静态网站生成
  • 服务器从安装到部署全过程(二)
  • 构建工具 - 收藏集 - 掘金
  • 前端路由实现-history
  • 强力优化Rancher k8s中国区的使用体验
  • 实现简单的正则表达式引擎
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 怎么把视频里的音乐提取出来
  • %@ page import=%的用法
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (day6) 319. 灯泡开关
  • (Python) SOAP Web Service (HTTP POST)
  • (八)Flink Join 连接
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (三)终结任务
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net Remoting常用部署结构
  • .NET 的程序集加载上下文
  • .net6+aspose.words导出word并转pdf
  • .net反混淆脱壳工具de4dot的使用
  • .NET技术成长路线架构图
  • .Net实现SCrypt Hash加密