题目链接: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;
}
};