1386. Cinema Seat Allocation

本文深入探讨了在算法竞赛中优化策略的关键要素,特别是在处理大规模数据集时如何避免超时,通过精巧地选择遍历对象,即遍历计数映射而非直接遍历输入数量,从而显著提高算法效率。文章还分享了一个具体案例,展示了如何利用C++中的映射数据结构来高效解决座位安排问题,旨在帮助读者理解并掌握高效算法设计的原则。
摘要由CSDN通过智能技术生成

这道题能通过的关键在于这个,主要是因为n>>cnt.size();如果你是遍历n,则一定超时,如果遍历的是cnt,则能够成功提交。

res+2*(n-cnt.size());
class Solution {
public:
    int func(map<int, int>& blocks){
        if (blocks.size()==0){
            return 2;
        }
        
        
        // start 2,4,6
        int count = 0;
        for(int start=2;start<=6;){
            if (blocks[start]==1||blocks[start+1]==1){
                start += 2;
            }
            else{
                if (blocks[start+2]==1||blocks[start+3]==1){
                    start += 4;
                }
                else{
                    count ++;
                    start += 4;
                }
            }
        }
        return count;
    }
    
    //reservedSeats最多10010个
    int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
        map<int, map<int, int>> cnt;
        for(int i=0;i<reservedSeats.size();i++){
            int row = reservedSeats[i][0];
            int colblock = reservedSeats[i][1];
            if (cnt.find(row)==cnt.end()){
                map<int, int> temp;
                temp[colblock] = 1;
                cnt[row] = temp;
            }
            else{
                cnt[row][colblock] = 1;
            }
        }
        
        int res = 0;
        for(auto it=cnt.begin();it!=cnt.end();it++){
            res += func(it->second);
        }
        return res+(n-cnt.size())*2;
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值