第57场LeetCode双周赛

2E46A3417181C5E2285BE8A1CAEC87ED

心情

题目在此
这次没打,因为比赛是在夜里开始的,所以就补题呗,题目挺难的(对于我来说,主要是我太菜了)。

第一题(检查是否所有字符出现次数相同)

就简单的计数字母,循环判断一下就可以了。

第二题(最小未被占据椅子的编号)

在这里插入图片描述

题解:

  • 先用一个结构体存,到达和离开时间,人员编号,坐的位置。
  • 用set记录还有哪些空余的位置。
  • 用一个优先队列记录有哪些人在位置上。
  • 然后循环模拟一下就可以了。
struct node{
    int begin,end;
    int ip;     //编号
    int pos;    //坐的位置
    bool operator< (const node& a)const{
        return end > a.end;//最小值优先
    }
}arr[10010];
bool cmp(node a,node b){
    return a.begin < b.begin;
}
class Solution {
public:
    int smallestChair(vector<vector<int>>& t, int tf) {
        int n = t.size();
        for (int i = 0; i < n; i ++){
            arr[i].begin = t[i][0];
            arr[i].end = t[i][1];
            arr[i].ip = i;
        }
        sort(arr,arr+n,cmp);
        set<int> qs;     //记录空闲位置
        for (int i = 0; i < n+10; i ++) qs.insert(i);//事先把空位置预处理一下
        priority_queue<node> qn;    //记录在位置上的人
        for (int i = 0; i < n; i ++){
            auto tp = arr[i];
            while(!qn.empty()&&qn.top().end <= tp.begin){
                qs.insert(qn.top().pos);	
                qn.pop();
            }
            if (tp.ip == tf){
                return *(qs.begin());
            }
            //放到座位上
            tp.pos = *(qs.begin());
            qs.erase(qs.begin());
            qn.push(tp);
        }
        return -1;
    }
};

第三题(描述绘画结果)

在这里插入图片描述

思路:借鉴这场比赛排名第八那名大佬的
差分+标记
因为题目要求的原因:混合颜色的集合不相同,要分开写。
所以可以发现:最终求的所有的区间起点的终点一定是距离起点最近的一个题目给出区间的起点或终点。

typedef long long LL;
class Solution {
public:
    vector<vector<LL> > splitPainting(vector<vector<int>>& segments) {
        LL sum[100000+ 10] = {0};
        bool vis[100000+ 10] = {0};	//用一个标记把所有的起点终点都标记了
        for (auto t: segments) {
            int a = t[0], b = t[1];
            sum[a] += t[2];
            sum[b] -= t[2];
            vis[a] = true;		//都标记
            vis[b] = true;
        }
        LL cnt = 0;
        int p = 0;
        vector<vector<LL> > res;
        for (int i=1; i<= 100001; ++i) {
            if (cnt > 0 && vis[i] ) {	//找到终点,cnt > 0 为了避免此时这个标记是起点
                res.push_back({p,i,now});	//加入答案集合
            }
            if (vis[i]) p = i;//记录所求区间起点
            cnt += sum[i];	  //前缀和
        }
        return res;
    }
};

第四题(队列中可以看到的人数)

未完待续(可能 已经完了😭)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值