当前位置: 首页 > 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编程的初学者和有一定编程基础的人。无…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...