Skip to content

Commit 2b89a6a

Browse files
committed
feat: add solutions to lc problem: No.1386
No.1386.Cinema Seat Allocation
1 parent b0f14cd commit 2b89a6a

File tree

6 files changed

+260
-2
lines changed

6 files changed

+260
-2
lines changed

solution/1300-1399/1386.Cinema Seat Allocation/README.md

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,116 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57+
**方法一:哈希表 + 位运算**
58+
59+
用哈希表 m 记录每一行的座位预定情况。
60+
61+
哈希表中没有出现的行,每行可坐 2 个 4 人家庭,即 `(n - len(m)) << 1`
62+
63+
遍历哈希表中出现的行,依次尝试 1234, 5678, 3456 这几个连续座位(注意这里下标从 0 开始)是否均没被预定,是则累加答案,并且将此连续作为置为已预定。
64+
5765
<!-- tabs:start -->
5866

5967
### **Python3**
6068

6169
<!-- 这里可写当前语言的特殊实现逻辑 -->
6270

6371
```python
64-
72+
class Solution:
73+
def maxNumberOfFamilies(self, n: int, reservedSeats: List[List[int]]) -> int:
74+
m = defaultdict(int)
75+
for i, j in reservedSeats:
76+
m[i] = m[i] | (1 << (10 - j))
77+
masks = (0b0111100000, 0b0000011110, 0b0001111000)
78+
ans = (n - len(m)) << 1
79+
for v in m.values():
80+
for mask in masks:
81+
if (v & mask) == 0:
82+
v |= mask
83+
ans += 1
84+
return ans
6585
```
6686

6787
### **Java**
6888

6989
<!-- 这里可写当前语言的特殊实现逻辑 -->
7090

7191
```java
92+
class Solution {
93+
public int maxNumberOfFamilies(int n, int[][] reservedSeats) {
94+
Map<Integer, Integer> m = new HashMap<>();
95+
for (int[] e : reservedSeats) {
96+
int i = e[0], j = 10 - e[1];
97+
int v = m.getOrDefault(i, 0);
98+
v |= 1 << j;
99+
m.put(i, v);
100+
}
101+
int[] masks = {0b0111100000, 0b0000011110, 0b0001111000};
102+
int ans = (n - m.size()) << 1;
103+
for (int v : m.values()) {
104+
for (int mask : masks) {
105+
if ((v & mask) == 0) {
106+
v |= mask;
107+
++ans;
108+
}
109+
}
110+
}
111+
return ans;
112+
}
113+
}
114+
```
115+
116+
### **C++**
117+
118+
```cpp
119+
class Solution {
120+
public:
121+
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
122+
unordered_map<int, int> m;
123+
for (auto& e : reservedSeats)
124+
{
125+
int i = e[0], j = 10 - e[1];
126+
m[i] |= (1 << j);
127+
}
128+
vector<int> masks = {0b0111100000, 0b0000011110, 0b0001111000};
129+
int ans = (n - m.size()) << 1;
130+
for (auto& [_, v] : m)
131+
{
132+
for (int& mask : masks)
133+
{
134+
if ((v & mask) == 0)
135+
{
136+
v |= mask;
137+
++ans;
138+
}
139+
}
140+
}
141+
return ans;
142+
}
143+
};
144+
```
72145
146+
### **Go**
147+
148+
```go
149+
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
150+
m := map[int]int{}
151+
for _, e := range reservedSeats {
152+
i, j := e[0], 10-e[1]
153+
m[i] |= 1 << j
154+
}
155+
masks := []int{0b0111100000, 0b0000011110, 0b0001111000}
156+
ans := (n - len(m)) << 1
157+
for _, v := range m {
158+
for _, mask := range masks {
159+
if (v & mask) == 0 {
160+
v |= mask
161+
ans++
162+
}
163+
}
164+
}
165+
return ans
166+
}
73167
```
74168

75169
### **...**

solution/1300-1399/1386.Cinema Seat Allocation/README_EN.md

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,99 @@
5656
### **Python3**
5757

5858
```python
59-
59+
class Solution:
60+
def maxNumberOfFamilies(self, n: int, reservedSeats: List[List[int]]) -> int:
61+
m = defaultdict(int)
62+
for i, j in reservedSeats:
63+
m[i] = m[i] | (1 << (10 - j))
64+
masks = (0b0111100000, 0b0000011110, 0b0001111000)
65+
ans = (n - len(m)) << 1
66+
for v in m.values():
67+
for mask in masks:
68+
if (v & mask) == 0:
69+
v |= mask
70+
ans += 1
71+
return ans
6072
```
6173

6274
### **Java**
6375

6476
```java
77+
class Solution {
78+
public int maxNumberOfFamilies(int n, int[][] reservedSeats) {
79+
Map<Integer, Integer> m = new HashMap<>();
80+
for (int[] e : reservedSeats) {
81+
int i = e[0], j = 10 - e[1];
82+
int v = m.getOrDefault(i, 0);
83+
v |= 1 << j;
84+
m.put(i, v);
85+
}
86+
int[] masks = {0b0111100000, 0b0000011110, 0b0001111000};
87+
int ans = (n - m.size()) << 1;
88+
for (int v : m.values()) {
89+
for (int mask : masks) {
90+
if ((v & mask) == 0) {
91+
v |= mask;
92+
++ans;
93+
}
94+
}
95+
}
96+
return ans;
97+
}
98+
}
99+
```
100+
101+
### **C++**
102+
103+
```cpp
104+
class Solution {
105+
public:
106+
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
107+
unordered_map<int, int> m;
108+
for (auto& e : reservedSeats)
109+
{
110+
int i = e[0], j = 10 - e[1];
111+
m[i] |= (1 << j);
112+
}
113+
vector<int> masks = {0b0111100000, 0b0000011110, 0b0001111000};
114+
int ans = (n - m.size()) << 1;
115+
for (auto& [_, v] : m)
116+
{
117+
for (int& mask : masks)
118+
{
119+
if ((v & mask) == 0)
120+
{
121+
v |= mask;
122+
++ans;
123+
}
124+
}
125+
}
126+
return ans;
127+
}
128+
};
129+
```
65130
131+
### **Go**
132+
133+
```go
134+
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
135+
m := map[int]int{}
136+
for _, e := range reservedSeats {
137+
i, j := e[0], 10-e[1]
138+
m[i] |= 1 << j
139+
}
140+
masks := []int{0b0111100000, 0b0000011110, 0b0001111000}
141+
ans := (n - len(m)) << 1
142+
for _, v := range m {
143+
for _, mask := range masks {
144+
if (v & mask) == 0 {
145+
v |= mask
146+
ans++
147+
}
148+
}
149+
}
150+
return ans
151+
}
66152
```
67153

68154
### **...**
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
4+
unordered_map<int, int> m;
5+
for (auto& e : reservedSeats)
6+
{
7+
int i = e[0], j = 10 - e[1];
8+
m[i] |= (1 << j);
9+
}
10+
vector<int> masks = {0b0111100000, 0b0000011110, 0b0001111000};
11+
int ans = (n - m.size()) << 1;
12+
for (auto& [_, v] : m)
13+
{
14+
for (int& mask : masks)
15+
{
16+
if ((v & mask) == 0)
17+
{
18+
v |= mask;
19+
++ans;
20+
}
21+
}
22+
}
23+
return ans;
24+
}
25+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
2+
m := map[int]int{}
3+
for _, e := range reservedSeats {
4+
i, j := e[0], 10-e[1]
5+
m[i] |= 1 << j
6+
}
7+
masks := []int{0b0111100000, 0b0000011110, 0b0001111000}
8+
ans := (n - len(m)) << 1
9+
for _, v := range m {
10+
for _, mask := range masks {
11+
if (v & mask) == 0 {
12+
v |= mask
13+
ans++
14+
}
15+
}
16+
}
17+
return ans
18+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int maxNumberOfFamilies(int n, int[][] reservedSeats) {
3+
Map<Integer, Integer> m = new HashMap<>();
4+
for (int[] e : reservedSeats) {
5+
int i = e[0], j = 10 - e[1];
6+
int v = m.getOrDefault(i, 0);
7+
v |= 1 << j;
8+
m.put(i, v);
9+
}
10+
int[] masks = {0b0111100000, 0b0000011110, 0b0001111000};
11+
int ans = (n - m.size()) << 1;
12+
for (int v : m.values()) {
13+
for (int mask : masks) {
14+
if ((v & mask) == 0) {
15+
v |= mask;
16+
++ans;
17+
}
18+
}
19+
}
20+
return ans;
21+
}
22+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def maxNumberOfFamilies(self, n: int, reservedSeats: List[List[int]]) -> int:
3+
m = defaultdict(int)
4+
for i, j in reservedSeats:
5+
m[i] = m[i] | (1 << (10 - j))
6+
masks = (0b0111100000, 0b0000011110, 0b0001111000)
7+
ans = (n - len(m)) << 1
8+
for v in m.values():
9+
for mask in masks:
10+
if (v & mask) == 0:
11+
v |= mask
12+
ans += 1
13+
return ans

0 commit comments

Comments
 (0)