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[i1]+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 场双周赛(康复训练)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第69场双周赛

LeetCode第82场双周赛

LeetCode第82场双周赛

LeetCode第82场双周赛

LeetCode 第 55 场双周赛 / 第 247 场周赛

LeetCode 第 14 场双周赛