Leetcode1847:最近的房间

news/2024/12/17 7:46:53/

题目描述: 

一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i] = [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。

同时给你 k 个查询,用二维数组 queries 表示,其中 queries[j] = [preferredj, minSizej] 。第 j 个查询的答案是满足如下条件的房间 id :

  • 房间的面积 至少 为 minSizej ,且
  • abs(id - preferredj) 的值 最小 ,其中 abs(x) 是 x 的绝对值。

如果差的绝对值有 相等 的,选择 最小 的 id 。如果 没有满足条件的房间 ,答案为 -1 。

请你返回长度为 k 的数组 answer ,其中 answer[j] 为第 j 个查询的结果。

代码思路:

  1. 房间排序
    • 首先,对房间列表 rooms 按照房间大小从大到小进行排序。这是因为如果房间越大,它越有可能满足更多的查询(因为查询要求的是最小房间大小)。
  2. 查询预处理
    • 给每个查询添加一个索引 i,以便在结果列表 res 中正确放置答案。
    • 然后,根据查询的最小房间大小从大到小对查询进行排序。这样做是为了保证在处理查询时,可以逐步增加符合条件的房间(因为房间已经按大小从大到小排序),从而避免重复处理。
  3. 初始化结果和辅助数据结构
    • 初始化结果列表 res,其长度为查询的数量,初始值为 0(后续会被替换为房间号或 -1)。
    • 使用一个哨兵值 INF(这里设为 10 ** 9),用于在 SortedSet 中表示无穷大,确保所有查询都能被正确处理(即使偏好房间号大于所有房间号或小于所有房间号)。
    • 初始化一个 SortedSet(有序集合),并添加 -INF 和 INF 作为边界,确保可以在集合中找到合适的插入位置。
  4. 滑动窗口和查询处理
    • 使用一个指针 ri 来遍历房间列表,并维护一个 SortedSet window 来存储当前可能满足查询条件的房间号。
    • 对于每个查询,逐步将满足最小房间大小的房间号加入 window,直到 window 中的房间不再满足查询的最小房间大小要求。
    • 使用 SortedSet 的 bisect_left 方法找到查询偏好房间号在 window 中的插入位置 idxR,以及它的前一个位置 idxL
    • 比较偏好房间号与 idxL 和 idxR 对应的房间号的距离,选择距离最小的房间号作为结果。
    • 如果结果是 -INF 或 INF,表示没有找到合适的房间,将结果设置为 -1
  5. 返回结果
    • 最后,返回结果列表 res,其中包含了每个查询的最近房间号或 -1

 代码实现:

python">from sortedcontainers import SortedSet
class Solution:def closestRoom(self, rooms: List[List[int]], queries: List[List[int]]) -> List[int]:rooms.sort(key = lambda r: -r[1])   #按照size从大到小排序rn = len(rooms)qn = len(queries)for i in range(qn):queries[i].append(i)        #加上index。在进res时按照index放置queries.sort(key = lambda q: -q[1]) #按照minSize从大到小排列res = [0 for _ in range(qn)]INF = 10 ** 9   #哨兵window = SortedSet()window.add(-INF)window.add(INF)ri = 0for preferID, minSize, qID in queries:while ri < rn and rooms[ri][1] >= minSize:  #房间的size比minSize大window.add(rooms[ri][0])     #房间号入window ri += 1idxR = window.bisect_left(preferID)idxL = idxR - 1L, R = window[idxL] , window[idxR]res[qID] = L if (preferID - L) <= (R - preferID) else Rif res[qID] in (-INF, INF):res[qID] = -1return res

 

 


http://www.ppmy.cn/news/1555808.html

相关文章

【SpringBoot】配置文件

在 Spring 项目中&#xff0c;我们必须自行创建 Spring 的配置文件&#xff0c;通常命名为 "spring-config.xml" 。但在 SpringBoot 中无需自行创建&#xff0c;在 SpringBoot 项目创建时就存在了即 application.properties 文件。它的用处: 设置项目的启动端口设置数…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

【Linux 进程间的通信】匿名管道

匿名管道是UNIX系统进程间通信&#xff08;IPC&#xff09;的一种基本形式&#xff0c;它允许具有血缘关系的进程之间进行数据传输。在Linux环境下&#xff0c;匿名管道是通过内核中的缓冲区实现的&#xff0c;这个缓冲区的大小是有限的&#xff0c;通常由操作系统决定。匿名管…

如何持续优化呼叫中心大模型呼出机器人的性能?

如何持续优化呼叫中心大模型呼出机器人的性能&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 持续优化呼叫中心大模型呼出机器人的性能是一个复杂而持续的过程&#xff0c;涉及多个层面的策略和措…

[图形渲染]【Unity】【游戏开发】Shader基础9 什么是固定管线渲染?

在图形渲染领域,**固定管线渲染(Fixed-Function Pipeline)**是一种历史悠久的渲染方法,曾是早期图形API(如OpenGL和DirectX)的核心设计思想。尽管它已经逐步被现代的可编程管线取代,但理解固定管线的概念对于学习图形渲染的演进和基础非常重要。 1. 什么是固定管线? …

STM32F407+LAN8720A +LWIP +FreeRTOS UDP通讯

STM32F407+LAN8720A +LWIP +FreeRTOS ping通 上一篇实现了LWIP ping 通 本篇实现UDP通讯 实现如下功能: 串口1空闲中断+DMA接收,收到数据用UDP发送UDP接收,收到数据用串口1发送STM32CUBEIDE配置和代码 1. 配置UARAT1的空闲中断+DMA接收 UART1接收到数据,释放信号量,在任…

【C++图论 二分图 DFS】785. 判断二分图|1624

本文涉及知识点 C图论 CDFS LeetCode785. 判断二分图 存在一个 无向图 &#xff0c;图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph &#xff0c;其中 graph[u] 是一个节点数组&#xff0c;由节点 u 的邻接节点组成。形式上…

onlyoffice 请求代理后的地址后续请求会重定向到80端口问题

问题描述&#xff1a; onlyoffice 服务是3333本机端口和80 docker容器端口 我需要在nginx服务器上代理到86端口的/oo/路径上 问题配置如下&#xff1a; server {listen 86;location /oo/ {proxy_pass http://192.168.199.129:3333/;} }这样配置出现请求重定向到80端口现象 最后…