题目描述![](https://i-blog.csdnimg.cn/blog_migrate/88401e26b5a7f19850734aac25f10e68.png)
如上图所示,电影院的观影厅中有 n 行座位,行编号从 1 到 n ,且每一行内总共有 10 个座位,列编号从 1 到 10 。
给你数组 reservedSeats ,包含所有已经被预约了的座位。比如说,researvedSeats[i]=[3,8] ,它表示第 3 行第 8 个座位被预约了。
请你返回 最多能安排多少个 4 人家庭 。4 人家庭要占据 同一行内连续 的 4 个座位。隔着过道的座位(比方说 [3,3] 和 [3,4])不是连续的座位,但是如果你可以将 4 人家庭拆成过道两边各坐 2 人,这样子是允许的。
示例 1:
输入:n = 3, reservedSeats = [[1,2],[1,3],[1,8],[2,6],[3,1],[3,10]]
输出:4
解释:上图所示是最优的安排方案,总共可以安排 4 个家庭。蓝色的叉表示被预约的座位,橙色的连续座位表示一个 4 人家庭。
示例 2:
输入:n = 2, reservedSeats = [[2,1],[1,8],[2,6]]
输出:2
示例 3:
输入:n = 4, reservedSeats = [[4,3],[1,4],[4,6],[1,7]]
输出:4
提示:
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] 都是互不相同的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cinema-seat-allocation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
class Solution {
public:
static bool cmp(vector<int> a,vector<int> b){
return a[0]<b[0];
}
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
if(reservedSeats.size()==0) return 2*n;
sort(reservedSeats.begin(),reservedSeats.end(),cmp);
int start=reservedSeats[0][0];
int ans = (start-1)*2;
int i=0,len=reservedSeats.size();
unordered_map<int,int> mp;
while(i<len){
mp.clear();
while(i<len && reservedSeats[i][0]==start) mp[reservedSeats[i++][1]]++;
int l=mp[2]+mp[3]+mp[4]+mp[5];
int m=mp[4]+mp[5]+mp[6]+mp[7];
int r=mp[6]+mp[7]+mp[8]+mp[9];
if(l+r==0) ans+=2;
else if((l==0)||(m==0)||(r==0)) ans++;
if(i<len){
ans += (reservedSeats[i][0]-start-1)*2;
start = reservedSeats[i][0];
}
}
ans += (n-start)*2;
return ans;
}
};