1386. Cinema Seat Allocation

Posted habibah-chang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1386. Cinema Seat Allocation相关的知识,希望对你有一定的参考价值。

问题:

给定一个有n排,每排10个位置的影院,已被预订座位列表。

求一个4人组要定在连续相邻座位的可能性有多少种。

其中对过道(3和4之间,7和8之间),将其中一个人分开的话,不算满足相邻条件。

技术图片

 

 

Example 1:
Input: n = 3, reservedSeats = [[1,2],[1,3],[1,8],[2,6],[3,1],[3,10]]
Output: 4
Explanation: The figure above shows the optimal allocation for four groups, where seats mark with blue are already reserved and contiguous seats mark with orange are for one group.

Example 2:
Input: n = 2, reservedSeats = [[2,1],[1,8],[2,6]]
Output: 2

Example 3:
Input: n = 4, reservedSeats = [[4,3],[1,4],[4,6],[1,7]]
Output: 4
 

Constraints:
1 <= n <= 10^9
1 <= reservedSeats.length <= min(10*n, 10^4)
reservedSeats[i].length == 2
1 <= reservedSeats[i][0] <= n
1 <= reservedSeats[i][1] <= 10
All reservedSeats[i] are distinct.

  技术图片

 

解法:

使用bit标记法,

对每一排标记为 0b 000 0000 000

的一个二进制数。

使用unordered_map<int,int> Seats//key:row;value:每行座位状况

来保存被预订后的影院座位状况。

若已被预订,则那一位被标记为1

Seats[row:i] |= (1<<reservedSeats[row:i][col])

 

遍历 reservedSeats,更新 Seats 中所有被预定的位置

然后再遍历 Seats

若当前排的状态

1.满足 011 1111 110 这些1的位置上,为0(即未被占)

那么,有2种可能的选择。

2.满足 011 1100 000 这些1的位置上,为0(即未被占)

那么,有1种可能的选择。

3.满足 000 0011 110 这些1的位置上,为0(即未被占)

那么,有1种可能的选择。

4.满足 000 1111 000 这些1的位置上,为0(即未被占)

那么,有1种可能的选择。

 

把所有可能累加 res。

再加上整排未被占用的情况

有n-Seats.size()排未被占用。

这样的每一排,有2中可能。

因此,最终结果=res+2*(n-Seats.size())

 

?? 注意:

1.位操作运算 和判断符号==的优先度,==更高,

因此注意需要位运算的话,记得加括号。

2.二进制表示:0b

八进制表示:0

十六进制表示:0x

 

?? 优化:由于不考虑位置1和位置10,(如果要选择这两个位置,4人组必定不能连续,不满足题意)

所需判断的有效位仅为2~9,共8位,因此可简化int->char,节省空间。即:

unordered_map<int,char> Seats;

代码参考:

 1 class Solution {
 2 public:
 3     int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
 4         //start:2,4,6
 5         int res=0;
 6         unordered_map<int,int> Seats;
 7         for(vector<int> seat:reservedSeats){
 8             Seats[seat[0]-1] |= (1<<(seat[1]-1));
 9         }
10         for(auto row:Seats){
11             int cout=0;
12             if((row.second & 0b0111100000) == 0) cout+=1;
13             if((row.second & 0b0000011110) == 0) cout+=1;
14             if(cout==0 && (row.second & 0b0001111000) == 0) cout=1;
15             res+=cout;
16         }
17         return (n-Seats.size())*2+res;
18     }
19 };

 

以上是关于1386. Cinema Seat Allocation的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]603. 连续空余座位(Mysql自连接)

Mysql练习 连续空余座位 笛卡尔积

Mysql练习 连续空余座位 笛卡尔积

电影售票系统01

UVa1386

一本通 P1386 打击犯罪