LeetCode第 51 场双周赛(康复训练)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第 51 场双周赛(康复训练)相关的知识,希望对你有一定的参考价值。
LeetCode第 51 场双周赛(康复训练)
A. 简单模拟。
B. 插入,删除,二分查找,用set即可。
C. 贪心dp,考虑排序后的最优解,最后元素的相对顺序与未减小的相对顺序相同,然后就可令 d p [ i ] dp[i] dp[i]表示前 i i i个元素的最大值。 d p [ i ] = m i n ( d p [ i − 1 ] + 1 , a [ i ] ) dp[i]=min(dp[i-1]+1,a[i]) dp[i]=min(dp[i−1]+1,a[i])
D. 多组询问,二分查找满足某一个范围集合的最接近的值。考虑离线,对query按照size从大到小排序,然后可以保证插入数据的时候是单调的(也是从大往小插),然后查找的话,就二分找第一个大于等于的最小值,然后它的迭代器减1,就是另一个可能的值,然后去较小即可,注意先在set集合里加入正负无穷,防止查找到空。
code
class Solution {
public:
struct query{
int p,m,id;
bool operator<(const query&q)const{
return m<q.m;
}
};
vector<int> closestRoom(vector<vector<int>>& r, vector<vector<int>>& qe) {
int n=qe.size();
vector<query>q(n);
for(int i=0;i<n;i++){
q[i]={qe[i][0],qe[i][1],i};
}
sort(r.begin(),r.end(),[&](vector<int> &x,vector<int> &y){
return x[1]<y[1];
});
sort(q.begin(),q.end());
int m=r.size();
set<int>s;s.insert(-1e9),s.insert(1e9);
vector<int>ans(n);
for(int i=n-1,j=m-1;~i;i--){
while(j>=0&&r[j][1]>=q[i].m) s.insert(r[j--][0]);
auto x=s.lower_bound(q[i].p);
auto y=x;
y--;
int k=q[i].id;
// printf("%d %d\\n",*y,*x);
if(q[i].p-*y<=*x-q[i].p) ans[k]=*y;
else ans[k]=*x;
if(abs(ans[k])==1e9) ans[k]=-1;
}
return ans;
}
};
以上是关于LeetCode第 51 场双周赛(康复训练)的主要内容,如果未能解决你的问题,请参考以下文章