日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)

發布時間:2024/7/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1847. 最近的房间(排序离线计算 + 二分查找) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

一個酒店里有 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,2],[1,2],[3,2]], queries = [[3,1],[3,3],[5,2]] 輸出:[3,-1,3] 解釋:查詢的答案如下: 查詢 [3,1] :房間 3 的面積為 2 ,大于等于 1 ,且號碼是最接近 3 的,為 abs(3 - 3) = 0 ,所以答案為 3 。 查詢 [3,3] :沒有房間的面積至少為 3 ,所以答案為 -1 。 查詢 [5,2] :房間 3 的面積為 2 ,大于等于 2 ,且號碼是最接近 5 的,為 abs(3 - 5) = 2 ,所以答案為 3 。示例 2: 輸入:rooms = [[1,4],[2,3],[3,5],[4,1],[5,2]], queries = [[2,3],[2,4],[2,5]] 輸出:[2,1,3] 解釋:查詢的答案如下: 查詢 [2,3] :房間 2 的面積為 3 ,大于等于 3 ,且號碼是最接近的,為 abs(2 - 2) = 0 ,所以答案為 2 。 查詢 [2,4] :房間 13 的面積都至少為 4 ,答案為 1 因為它房間編號更小。 查詢 [2,5] :房間 3 是唯一面積大于等于 5 的,所以答案為 3 。提示: n == rooms.length 1 <= n <= 10^5 k == queries.length 1 <= k <= 10^4 1 <= roomIdi, preferredj <= 10^7 1 <= sizei, minSizej <= 10^7

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/closest-room
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

類似題目:
LeetCode 1851. 包含每個查詢的最小區間(排序 + 離線查詢 + 優先隊列)

  • 先對所有的 rooms 排序,尺寸大的先, 查詢 q 也是,尺寸大的先查(后續的查詢中,之前的房間尺寸都是滿足要求的)
  • 然后依次查詢,將滿足尺寸的房間 id 插入 set,進行 二分查找,找到最接近的 id
class Solution { public:vector<int> closestRoom(vector<vector<int>>& rooms, vector<vector<int>>& q) {// 房間尺寸從大到小排序vector<pair<int,int>> R(rooms.size());int k = 0;for(auto& r : rooms){R[k] = {rooms[k][0], rooms[k][1]};k++;} // vector 轉 成 pair ,排序,不做此操作,超時。。。sort(R.begin(), R.end(),[&](auto a, auto b){return a.second > b.second;});int n = q.size();vector<int> ans(n, -1);vector<int> idx(n);iota(idx.begin(), idx.end(),0);sort(idx.begin(), idx.end(),[&](auto a, auto b){return q[a][1] > q[b][1];//查詢按照大的到小的查詢});set<int> s;int j = 0, preferred, minSize, closest, minidgap;for(auto i : idx){preferred = q[i][0];minSize = q[i][1];while(j < R.size() && R[j].second >= minSize){ // 尺寸滿足的,插入 id 到 sets.insert(R[j].first);j++;}closest = -1;minidgap = INT_MAX;auto it = s.lower_bound(preferred);//二分查找if(it != s.end()){closest = *it;minidgap = *it - preferred;}if(it != s.begin()){--it;if(preferred - *it <= minidgap){closest = *it;}}ans[i] = closest;}return ans;} };

608 ms 146.7 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。