Skip to content

Commit f44b99b

Browse files
committed
feat: add solutions to lc problem: No.1386
No.1386 Cinema Seat Allocation
1 parent 6459bce commit f44b99b

File tree

7 files changed

+161
-100
lines changed

7 files changed

+161
-100
lines changed

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

Lines changed: 62 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,19 @@
5454

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

57-
**方法一:哈希表 + 位运算**
57+
**方法一:哈希表 + 状态压缩**
5858

59-
用哈希表 m 记录每一行的座位预定情况
59+
我们用哈希表 $d$ 来存储所有已经被预约的座位,其中键为行号,值为该行上已经被预约的座位的状态,即一个二进制数,第 $j$ 位为 $1$ 表示第 $j$ 个座位已经被预约,为 $0$ 表示第 $j$ 个座位尚未被预约
6060

61-
哈希表中没有出现的行,每行可坐 2 个 4 人家庭,即 `(n - len(m)) << 1`
61+
我们遍历 $reservedSeats$,对于每个座位 $(i, j)$,将第 $j$ 个座位(对应低位的第 $10-j$ 位)的状态加入到 $d[i]$ 中即可
6262

63-
遍历哈希表中出现的行,依次贪心尝试 1234, 5678, 3456 这几个连续座位(注意这里下标从 0 开始)是否均没被预定,是则累加答案,并且将此连续座位置为已预定。
63+
对于没有出现在哈希表 $d$ 中的行,我们可以任意安排 $2$ 个家庭,因此,初始答案为 $(n - len(d)) \times 2$。
64+
65+
接下来,我们遍历哈希表中每一行的状态,对于每一行,我们依次尝试安排 $1234, 5678, 3456$ 这几种情况,如果某种情况可以安排,我们就将答案加 $1$。
66+
67+
遍历结束后,我们就得到了最终的答案。
68+
69+
时间复杂度 $O(m)$,空间复杂度 $O(m)$,其中 $m$ 是 $reservedSeats$ 的长度。
6470

6571
<!-- tabs:start -->
6672

@@ -71,15 +77,15 @@
7177
```python
7278
class Solution:
7379
def maxNumberOfFamilies(self, n: int, reservedSeats: List[List[int]]) -> int:
74-
m = defaultdict(int)
80+
d = defaultdict(int)
7581
for i, j in reservedSeats:
76-
m[i] = m[i] | (1 << (10 - j))
82+
d[i] |= 1 << (10 - j)
7783
masks = (0b0111100000, 0b0000011110, 0b0001111000)
78-
ans = (n - len(m)) << 1
79-
for v in m.values():
84+
ans = (n - len(d)) * 2
85+
for x in d.values():
8086
for mask in masks:
81-
if (v & mask) == 0:
82-
v |= mask
87+
if (x & mask) == 0:
88+
x |= mask
8389
ans += 1
8490
return ans
8591
```
@@ -91,19 +97,17 @@ class Solution:
9197
```java
9298
class Solution {
9399
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+
Map<Integer, Integer> d = new HashMap<>();
101+
for (var e : reservedSeats) {
102+
int i = e[0], j = e[1];
103+
d.merge(i, 1 << (10 - j), (x, y) -> x | y);
100104
}
101105
int[] masks = {0b0111100000, 0b0000011110, 0b0001111000};
102-
int ans = (n - m.size()) << 1;
103-
for (int v : m.values()) {
106+
int ans = (n - d.size()) * 2;
107+
for (int x : d.values()) {
104108
for (int mask : masks) {
105-
if ((v & mask) == 0) {
106-
v |= mask;
109+
if ((x & mask) == 0) {
110+
x |= mask;
107111
++ans;
108112
}
109113
}
@@ -119,17 +123,17 @@ class Solution {
119123
class Solution {
120124
public:
121125
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
122-
unordered_map<int, int> m;
126+
unordered_map<int, int> d;
123127
for (auto& e : reservedSeats) {
124-
int i = e[0], j = 10 - e[1];
125-
m[i] |= (1 << j);
128+
int i = e[0], j = e[1];
129+
d[i] |= 1 << (10 - j);
126130
}
127-
vector<int> masks = {0b0111100000, 0b0000011110, 0b0001111000};
128-
int ans = (n - m.size()) << 1;
129-
for (auto& [_, v] : m) {
131+
int masks[3] = {0b0111100000, 0b0000011110, 0b0001111000};
132+
int ans = (n - d.size()) * 2;
133+
for (auto& [_, x] : d) {
130134
for (int& mask : masks) {
131-
if ((v & mask) == 0) {
132-
v |= mask;
135+
if ((x & mask) == 0) {
136+
x |= mask;
133137
++ans;
134138
}
135139
}
@@ -143,17 +147,17 @@ public:
143147
144148
```go
145149
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
146-
m := map[int]int{}
150+
d := map[int]int{}
147151
for _, e := range reservedSeats {
148-
i, j := e[0], 10-e[1]
149-
m[i] |= 1 << j
152+
i, j := e[0], e[1]
153+
d[i] |= 1 << (10 - j)
150154
}
151-
masks := []int{0b0111100000, 0b0000011110, 0b0001111000}
152-
ans := (n - len(m)) << 1
153-
for _, v := range m {
155+
ans := (n - len(d)) * 2
156+
masks := [3]int{0b0111100000, 0b0000011110, 0b0001111000}
157+
for _, x := range d {
154158
for _, mask := range masks {
155-
if (v & mask) == 0 {
156-
v |= mask
159+
if x&mask == 0 {
160+
x |= mask
157161
ans++
158162
}
159163
}
@@ -162,6 +166,28 @@ func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
162166
}
163167
```
164168

169+
### **TypeScript**
170+
171+
```ts
172+
function maxNumberOfFamilies(n: number, reservedSeats: number[][]): number {
173+
const d: Map<number, number> = new Map();
174+
for (const [i, j] of reservedSeats) {
175+
d.set(i, (d.get(i) ?? 0) | (1 << (10 - j)));
176+
}
177+
let ans = (n - d.size) << 1;
178+
const masks = [0b0111100000, 0b0000011110, 0b0001111000];
179+
for (let [_, x] of d) {
180+
for (const mask of masks) {
181+
if ((x & mask) === 0) {
182+
x |= mask;
183+
++ans;
184+
}
185+
}
186+
}
187+
return ans;
188+
}
189+
```
190+
165191
### **...**
166192

167193
```

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

Lines changed: 52 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@
5858
```python
5959
class Solution:
6060
def maxNumberOfFamilies(self, n: int, reservedSeats: List[List[int]]) -> int:
61-
m = defaultdict(int)
61+
d = defaultdict(int)
6262
for i, j in reservedSeats:
63-
m[i] = m[i] | (1 << (10 - j))
63+
d[i] |= 1 << (10 - j)
6464
masks = (0b0111100000, 0b0000011110, 0b0001111000)
65-
ans = (n - len(m)) << 1
66-
for v in m.values():
65+
ans = (n - len(d)) * 2
66+
for x in d.values():
6767
for mask in masks:
68-
if (v & mask) == 0:
69-
v |= mask
68+
if (x & mask) == 0:
69+
x |= mask
7070
ans += 1
7171
return ans
7272
```
@@ -76,19 +76,17 @@ class Solution:
7676
```java
7777
class Solution {
7878
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);
79+
Map<Integer, Integer> d = new HashMap<>();
80+
for (var e : reservedSeats) {
81+
int i = e[0], j = e[1];
82+
d.merge(i, 1 << (10 - j), (x, y) -> x | y);
8583
}
8684
int[] masks = {0b0111100000, 0b0000011110, 0b0001111000};
87-
int ans = (n - m.size()) << 1;
88-
for (int v : m.values()) {
85+
int ans = (n - d.size()) * 2;
86+
for (int x : d.values()) {
8987
for (int mask : masks) {
90-
if ((v & mask) == 0) {
91-
v |= mask;
88+
if ((x & mask) == 0) {
89+
x |= mask;
9290
++ans;
9391
}
9492
}
@@ -104,17 +102,17 @@ class Solution {
104102
class Solution {
105103
public:
106104
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
107-
unordered_map<int, int> m;
105+
unordered_map<int, int> d;
108106
for (auto& e : reservedSeats) {
109-
int i = e[0], j = 10 - e[1];
110-
m[i] |= (1 << j);
107+
int i = e[0], j = e[1];
108+
d[i] |= 1 << (10 - j);
111109
}
112-
vector<int> masks = {0b0111100000, 0b0000011110, 0b0001111000};
113-
int ans = (n - m.size()) << 1;
114-
for (auto& [_, v] : m) {
110+
int masks[3] = {0b0111100000, 0b0000011110, 0b0001111000};
111+
int ans = (n - d.size()) * 2;
112+
for (auto& [_, x] : d) {
115113
for (int& mask : masks) {
116-
if ((v & mask) == 0) {
117-
v |= mask;
114+
if ((x & mask) == 0) {
115+
x |= mask;
118116
++ans;
119117
}
120118
}
@@ -128,17 +126,17 @@ public:
128126
129127
```go
130128
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
131-
m := map[int]int{}
129+
d := map[int]int{}
132130
for _, e := range reservedSeats {
133-
i, j := e[0], 10-e[1]
134-
m[i] |= 1 << j
131+
i, j := e[0], e[1]
132+
d[i] |= 1 << (10 - j)
135133
}
136-
masks := []int{0b0111100000, 0b0000011110, 0b0001111000}
137-
ans := (n - len(m)) << 1
138-
for _, v := range m {
134+
ans := (n - len(d)) * 2
135+
masks := [3]int{0b0111100000, 0b0000011110, 0b0001111000}
136+
for _, x := range d {
139137
for _, mask := range masks {
140-
if (v & mask) == 0 {
141-
v |= mask
138+
if x&mask == 0 {
139+
x |= mask
142140
ans++
143141
}
144142
}
@@ -147,6 +145,28 @@ func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
147145
}
148146
```
149147

148+
### **TypeScript**
149+
150+
```ts
151+
function maxNumberOfFamilies(n: number, reservedSeats: number[][]): number {
152+
const d: Map<number, number> = new Map();
153+
for (const [i, j] of reservedSeats) {
154+
d.set(i, (d.get(i) ?? 0) | (1 << (10 - j)));
155+
}
156+
let ans = (n - d.size) << 1;
157+
const masks = [0b0111100000, 0b0000011110, 0b0001111000];
158+
for (let [_, x] of d) {
159+
for (const mask of masks) {
160+
if ((x & mask) === 0) {
161+
x |= mask;
162+
++ans;
163+
}
164+
}
165+
}
166+
return ans;
167+
}
168+
```
169+
150170
### **...**
151171

152172
```

solution/1300-1399/1386.Cinema Seat Allocation/Solution.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
class Solution {
22
public:
33
int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
4-
unordered_map<int, int> m;
4+
unordered_map<int, int> d;
55
for (auto& e : reservedSeats) {
6-
int i = e[0], j = 10 - e[1];
7-
m[i] |= (1 << j);
6+
int i = e[0], j = e[1];
7+
d[i] |= 1 << (10 - j);
88
}
9-
vector<int> masks = {0b0111100000, 0b0000011110, 0b0001111000};
10-
int ans = (n - m.size()) << 1;
11-
for (auto& [_, v] : m) {
9+
int masks[3] = {0b0111100000, 0b0000011110, 0b0001111000};
10+
int ans = (n - d.size()) * 2;
11+
for (auto& [_, x] : d) {
1212
for (int& mask : masks) {
13-
if ((v & mask) == 0) {
14-
v |= mask;
13+
if ((x & mask) == 0) {
14+
x |= mask;
1515
++ans;
1616
}
1717
}

solution/1300-1399/1386.Cinema Seat Allocation/Solution.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
2-
m := map[int]int{}
2+
d := map[int]int{}
33
for _, e := range reservedSeats {
4-
i, j := e[0], 10-e[1]
5-
m[i] |= 1 << j
4+
i, j := e[0], e[1]
5+
d[i] |= 1 << (10 - j)
66
}
7-
masks := []int{0b0111100000, 0b0000011110, 0b0001111000}
8-
ans := (n - len(m)) << 1
9-
for _, v := range m {
7+
ans := (n - len(d)) * 2
8+
masks := [3]int{0b0111100000, 0b0000011110, 0b0001111000}
9+
for _, x := range d {
1010
for _, mask := range masks {
11-
if (v & mask) == 0 {
12-
v |= mask
11+
if x&mask == 0 {
12+
x |= mask
1313
ans++
1414
}
1515
}

solution/1300-1399/1386.Cinema Seat Allocation/Solution.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
class Solution {
22
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);
3+
Map<Integer, Integer> d = new HashMap<>();
4+
for (var e : reservedSeats) {
5+
int i = e[0], j = e[1];
6+
d.merge(i, 1 << (10 - j), (x, y) -> x | y);
97
}
108
int[] masks = {0b0111100000, 0b0000011110, 0b0001111000};
11-
int ans = (n - m.size()) << 1;
12-
for (int v : m.values()) {
9+
int ans = (n - d.size()) * 2;
10+
for (int x : d.values()) {
1311
for (int mask : masks) {
14-
if ((v & mask) == 0) {
15-
v |= mask;
12+
if ((x & mask) == 0) {
13+
x |= mask;
1614
++ans;
1715
}
1816
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
class Solution:
22
def maxNumberOfFamilies(self, n: int, reservedSeats: List[List[int]]) -> int:
3-
m = defaultdict(int)
3+
d = defaultdict(int)
44
for i, j in reservedSeats:
5-
m[i] = m[i] | (1 << (10 - j))
5+
d[i] |= 1 << (10 - j)
66
masks = (0b0111100000, 0b0000011110, 0b0001111000)
7-
ans = (n - len(m)) << 1
8-
for v in m.values():
7+
ans = (n - len(d)) * 2
8+
for x in d.values():
99
for mask in masks:
10-
if (v & mask) == 0:
11-
v |= mask
10+
if (x & mask) == 0:
11+
x |= mask
1212
ans += 1
1313
return ans

0 commit comments

Comments
 (0)