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

Leetcode 2940. Find Building Where Alice and Bob Can Meet

  • Leetcode 2940. Find Building Where Alice and Bob Can Meet
    • 1. 解题思路
    • 2. 代码实现
    • 3. 算法优化
  • 题目链接:2940. Find Building Where Alice and Bob Can Meet

1. 解题思路

这一题本质上又是限制条件下求极值的问题,算是我最不喜欢的题目类型之一吧,因为真的挺考验智商的……

很不幸,没想到啥好的思路,还是分步实现的策略,第一步就是找到每一个位置上后续能够访问的全部位置,然后第二步就是在对于query的两个位置直接获得他们能够访问的位置,然后求公共的最小元素。

显然,对于第一个问题,我们只需要对原数组进行排序,然后从高到低依次插入到有序队列当中,此时其插入时队列后方的所有元素就为其能够访问的所有位置。

由此,我们就能够在 O ( N ⋅ l o g N ) O(N \cdot logN) O(NlogN)的时间复杂度能找到所有坐标上能够访问的所有位置。然后,剩下的问题就是如何去找到两个有序数列的最小公共元素。

这里,我做了个小trick,就是注意到了对于上述问题,显然如果两个序列有交集,那么显然,对于其中起始位置更高的那个序列(不妨记作序列A)而言,其最后一个元素必然也在另一个序列(不妨记作序列B)当中,且满足从某一个位置开始,必然有后方元素全在序列B当中,而其前方的序列均不在序列A当中。

由此,我们就可以使用一个二分搜索来快速找寻上述最小公共坐标了,所有query的时间复杂度也为 O ( N ⋅ l o g N ) O(N \cdot logN) O(NlogN)

然而没有想到的是,这里居然遇到了内存爆炸的问题,就很懵逼……

这里,我是通过剪枝和及时删除的方法处理掉了这个问题,但是这里多少有点取巧了,而且非常的不优雅,就很难受了。

所谓剪枝倒是思路还挺自然,因为如果有两个坐标 i , j i,j i,j,满足 i = j i=j i=j或者 i < j i<j i<j h i < h j h_i < h_j hi<hj,那答案就是 j j j,反之亦然。这样,我们就可以先去掉很多easy case了。

然后,关于及时删除,就是首先对query也进行一下排序,然后优先做那些可以快速得到后方位置的坐标对应的query,然后在他们后续不会再被使用时及时进行删除,通过这种方式,我们在这道题上面是通过了测试样例,不过很取巧就是了……

2. 代码实现

给出python代码实现如下:

class Solution:def leftmostBuildingQueries(self, heights: List[int], queries: List[List[int]]) -> List[int]:buildings = [(idx, h) for idx, h in enumerate(heights)]buildings = sorted(buildings, key=lambda x: (x[1], -x[0]), reverse=True)indexes = {x[0]: i for i, x in enumerate(buildings)}res = [-1 for _ in queries]queries = [(idx, i, j) for idx, (i, j) in enumerate(queries)]for idx, i, j in queries:if i == j:res[idx] = ielif i < j and heights[i] < heights[j]:res[idx] = jelif i > j and heights[i] > heights[j]:res[idx] = iqueries = [(idx, i, j) if indexes[i] < indexes[j] else (idx, j, i) for (idx, i, j) in queries if res[idx] == -1]queries = sorted(queries, key=lambda x: indexes[x[2]])trigger = defaultdict(list)last_seen = defaultdict(int)for idx, i, j in queries:trigger[j].append((idx, i, j))last_seen[i] = idxlast_seen[j] = idxdef query(i, j):if i == j:return ir1, r2 = can_reach[i], can_reach[j]n, m = len(r1), len(r2)idx = bisect.bisect_left(r2, r1[0])if idx < m and r1[0] == r2[idx]:return r1[0]i = 0idx = bisect.bisect_left(r2, r1[-1])if idx >= m or r1[-1] != r2[idx]:return -1j = n-1while i < j-1:k = (i+j) // 2idx = bisect.bisect_left(r2, r1[k])if idx < m and r1[k] == r2[idx]:j = kelse:i = kreturn r1[j]s = []can_reach = {}for i, h in buildings:idx = bisect.bisect_left(s, i)s.insert(idx, i)if i in last_seen:can_reach[i] = s[idx:]for idx, i, j in trigger[i]:res[idx] = query(i, j)if last_seen[i] == idx:can_reach.pop(i)if j != i and last_seen[j] == idx:can_reach.pop(j)return res

提交代码评测得到:耗时5336ms,占用内存100.2MB。

3. 算法优化

看了一下大佬们的最优解答,发现在剪枝这部分大家其实思路是一致的,但是在那些复杂case的处理上大佬们的思路实在是太牛了。

他们的思路是直接使用堆排的方式,先将所需要比对的位置全部用一个堆排维护起来(其实用有序数列也行),然后考察每一个位置,看它能够作为那些位置的答案。

给出大佬们的实现方法如下:

class Solution:def leftmostBuildingQueries(self, heights: List[int], queries: List[List[int]]) -> List[int]:m = len(queries)res = [-1] * mq = []left = [[] for _ in heights]for k, (i, j) in enumerate(queries):if i > j:i, j = j, iif i == j or heights[i] < heights[j]:res[k] = jelse:left[j].append((heights[i], k))h = []for i, x in enumerate(heights):while h and h[0][0] < x:k = heappop(h)[1]res[k] = ifor p in left[i]:heappush(h, p)return res

提交代码评测得到:耗时3680ms,占用内存39.5MB。

相关文章:

Leetcode 2940. Find Building Where Alice and Bob Can Meet

Leetcode 2940. Find Building Where Alice and Bob Can Meet 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;2940. Find Building Where Alice and Bob Can Meet 1. 解题思路 这一题本质上又是限制条件下求极值的问题&#xff0c;算是我最不喜欢的题目类型之一吧…...

C++ 泛型编程,函数模版和类模版

1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础 就比如说活字印刷术&#xff0c;就是提供一个模具&#xff0c;然后根据模具来印刷出不同的字。 泛型编程跟着类似&#xff0c;提供一个模版&#xff0c;根据这…...

【封装UI组件库系列】封装Button图标组件

封装UI组件库系列第四篇封装Button按钮组件 &#x1f31f;前言 &#x1f31f;封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性&#xff1a; 支持的事件&#xff1a; 2.创建Button组件 &#x1f31f;封装功能属性 type主题颜色 plain是否朴素 loading等…...

windows系统mobaxterm远程执行linux上ssh命令

命令如下 start "" "%~dp0\MobaXterm_Personal_23.4.exe" -newtab "sshpass -p root ssh root192.168.11.92 mkdir 33" -p 是密码 左边是用户名&#xff0c;右边是服务器ip 后面跟的是服务器上执行的命令 第一次执行的时候要设置mobaxt…...

debian 12 配置

1. 修改apt源 修改apt源为http版本 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/d…...

AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…...

Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器

Vue 中简易封装网络请求&#xff08;Axios&#xff09;&#xff0c;包含请求拦截器和响应拦截器 axios简介 Axios 是一个基于 promise 的网络请求库&#xff0c;可以用于浏览器和 node.js Axios官方中文文档 特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支…...

git提交报错error: failed to push some refs to ‘git url‘

1.产生错误原因 想把本地仓库提交到远程仓库&#xff0c;报错信息如下 git提交报错信息 error: src refspec master does not match any error: failed to push some refs to git url 错误原因&#xff1a; 我们在创建仓库的时候&#xff0c;都会勾选“使用Reamdme文件初始化…...

【Python】(自定义函数)模块的相对路径导入

是我以前写的老文章的升级版&#xff0c;本质上使用exec和sys.path实现相对路径导入。 RelativeImport&#xff1a; __version__1.1.0 __author__Ls_Janimport os import sys import inspectdef RelativeImport(module,*args):#模块导入module为模块所在路径(模块名不需要.py后…...

巧妙之中见真章:深入解析常用的创建型设计模式

设计模式之创建型设计模式详解 一、设计模式是什么&#xff1f;二、模板方法2.1、代码结构2.2、符合的设计原则2.3、如何扩展代码2.4、小结 三、观察者模式3.1、代码结构3.2、符合的设计原则3.3、如何扩展代码3.4、小结 四、策略模式4.1、代码结构4.2、符合的设计原则4.3、如何…...

Selenium切换窗口、框架和弹出框window、ifame、alert

一、切换窗口 #获取打开的多个窗口句柄 windows driver.window_handles #切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) #最大化浏览器 driver.maximize_window() #刷新当前页面 driver.refresh() 二、切换框架frame 如存在以下网页&#xff1a; <htm…...

QT linux下应用程序打包

一、应用程序app 1、应用程序的pro文件 2、 程序工作函数 3、app的UI界面 二、动态库lib 1、Lib类头文件 2、.cpp文件 三、对应用程序和动态库进行构建 1、对动态库进行qmake,然后进行构建 2、对应用程序进行qmake&#xff0c;然后进行构建 3、查看构建目录 四、编写脚本 …...

Java高级技术(单元测试)

一&#xff0c;概括 二&#xff0c;junit 三&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;实验类 package com.bilibili;public class Name {public static void main(String name) {if (name null){System.out.println("0");return;}System.out.print…...

leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解

给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 不足节点 &#xff0c;并返回最终二叉树的根节点。假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit&#xff0c;则该节点被称之为 不足节点 &#xff0c;需要被删除…...

C++基础 -10- 类

类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};...

【软件测试】性能测试相关指标

性能测试 了解性能测试相关指标 1.什么是做性能测试 1.1 生活中遇到的软件性能问题 软件用着用着就不能用了&#xff0c;一看热搜&#xff0c;发现该软件的服务器崩崩溃了。 1.2 性能测试定义 测试人员借助性能测试工具&#xff0c;模拟系统在不同场景下&#xff0c;对应…...

Leetcode 2943. Maximize Area of Square Hole in Grid

Leetcode 2943. Maximize Area of Square Hole in Grid 1. 解题思路2. 代码实现 题目链接&#xff1a;2943. Maximize Area of Square Hole in Grid 1. 解题思路 这一题的话其实横轴和竖轴可以分开来独立考察&#xff0c;因为两者互不影响&#xff0c;我们最终的答案一定是两…...

qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.

QHBoxLayout水平布局,QVBoxLayout垂直布局,QFormLayout表单布局管理器,是常用的布局管理器,是用代码编写应用界面必不可少的功能类. 1.tips 这里值得注意的是,2个单选按钮(QRadioButton)同时放进一个水平布局管理器(QHBoxLayout)中,相当于放进了一个分组器中,此时,2个单选按钮…...

springboot中4级配置文件优先级

springboot中4级配置文件优先级...

Python(八十九)函数的参数的内存分析

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...