leetcode 1386. 安排电影院座位 位运算

题目要求在电影院的特定座位布局中,计算能容纳多少个四口之家,考虑座位已被预约的情况。通过位运算优化算法,解决亿级数据量下的效率问题。分析表明,对于有预约的行,需要根据预约状态确定可容纳的家庭数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://leetcode-cn.com/problems/cinema-seat-allocation/

在一个电影院里,有n行座位,每行10个,被过道分隔为左边三个中间四个右边三个。四口之家去看电影,有三种坐法,一是都坐中间,二是坐左边过道的两边(各坐两个人),三是坐右边过道两边(各坐两个人)。但是有的座位已经被预约了,问电影院还能够坐多少个这样的四口之家?
note: 1 < = n < = 1 0 9 1<=n<=10^9 1<=n<=109

分析

首先关注数据量,这里的数据量是亿级的,所以 O ( n ) O(n) O(n)复杂度一定会超时的。经过观察,能够得到如果某一行座位没有被预约,那么就能够安排两家人,要是被预约了我们就要根据预约情况来判断能够安排多少家庭。我们只处理有预约的座位行,采用位运算,记录被预约的行。

代码:

class Solution {
public:
    int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
        unordered_map<int,int> record;
        for(auto &vec:reservedSeats){
            record[vec[0]]|=(1<<(vec[1]-1));//记录保留位置
        }
        int ans=(n-record.size())*2;
        int a=0b0111111110;
        int b=0b0000011110;
        int c=0b0111100000;
        int d=0b0001111000;
        for(auto &p:record){
            if((p.second&a)==0){ans+=2;continue;}
            if((p.second&b)==0){ans+=1;continue;}
            if((p.second&c)==0){ans+=1;continue;}
            if((p.second&d)==0){ans+=1;continue;}
        }
        return ans;
    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值