5349.安排电影院座位 (Medium)*
题目描述*
电影院的观影厅中有 n 行座位,行编号从 1 到 n ,且每一行内总共有 10 个座位,列编号从 1 到 10 。
给你数组 reservedSeats ,包含所有已经被预约了的座位。比如说,researvedSeats[i]=[3,8] ,它表示第 3 行第 8 个座位被预约了。
请你返回 最多能安排多少个 4 人家庭 。4 人家庭要占据 同一行内连续 的 4 个座位。隔着过道的座位(比方说 [3,3] 和 [3,4])不是连续的座位,但是如果你可以将 4 人家庭拆成过道两边各坐 2 人,这样子是允许的。
提示*
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
所有 reservedSeats[i] 都是互不相同的。
代码*
题目乍一看好像挺麻烦,再一看感觉挺简单,然后就一顿写。然后就是无限的超时,主要还是没想到直接用 unordered_map<int, unordered_set<int>> 存预订座位,不过这里其实可以直接用一个 unordered_map<int, int> 存每一行的掩码就行了。
关键是本地测试的时候明明最后那个数据跑出来没超时,一提交就超时 cyka blyat!!!
要注意的就是应该从总座位数 2 * n 减去不满足的座位,因为没有预定的行不会记录到 seats。
class Solution {
public:
int maxNumberOfFamilies(int n, vector<vector<int>>& r) {
unordered_map<int, int> seats;
for(auto& i : r) {
seats[i[0]] |= (1 << i[1]);
}
int res = 2 * n;
for(auto iter = seats.begin(); iter != seats.end(); iter++) {
int mask = iter->second;
if((mask & 0x3fc) == 0) {
continue;
}else if((mask & 0x3c0) == 0 || (mask & 0x3c) == 0 || (mask & 0xf0) == 0) {
res -= 1;
}else {
res -= 2;
}
}
return res;
}
};
最后更新: July 23, 2022