5733. 最近的房间
题目连接
题目
思路
我们先对每个房间的面积和询问的面积限制进行排序,然后从大到小枚举每一种情况,如果能房间大于面积限制就将房间压入set中,为什么压入set中,因为这里面是有顺序的,怎样才能使得绝对值只差最小呢,那么肯定是肯定是询问值的左右两个值,然后通过二分找到当前询问的大于限制值的第一个房间号和其前一个值,如果左边值小等于右边值,那么左边就是要找的答案,否则就是右边,但是有可能这个房间不存在那么就需要在set两边加上左右边界。
通过代码
class Solution {
struct node{
int id,p,lim;
bool operator< (const node& tmp) const
{
return lim<tmp.lim;
}
};
public:
vector<int> closestRoom(vector<vector<int>>& rooms, vector<vector<int>>& queries) {
const int inf=1e9;
set<int>s{-inf,inf};
int len=rooms.size(),len1=queries.size();
vector<node>a(len1);
vector<int>res(len1);
for(int i=0;i<len1;i++) a[i]={i,queries[i][0],queries[i][1]};
sort(a.begin(),a.end());
sort(rooms.begin(),rooms.end(),[](vector<int>& x, vector<int>& y) { return x[1] < y[1];}) ;
for(int i=len1-1,j=len-1;i>=0;i--){
while(j>=0&&rooms[j][1]>=a[i].lim)s.insert(rooms[j--][0]);
auto it = s.lower_bound(a[i].p);
auto k=it;
--k;
if(a[i].p-*k<=*it-a[i].p)res[a[i].id]=*k;
else res[a[i].id]=*it;
if (res[a[i].id] == inf || res[a[i].id] == -inf) res[a[i].id] = -1;
}
return res;
}
};