Skip to content

Commit 322da71

Browse files
committed
feat: add solutions to lc problem: No.2293
No.2293.Min Max Game
1 parent 880d488 commit 322da71

File tree

13 files changed

+189
-167
lines changed

13 files changed

+189
-167
lines changed

solution/1800-1899/1815.Maximum Number of Groups Getting Fresh Donuts/README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,24 @@
5050
<!-- 这里可写当前语言的特殊实现逻辑 -->
5151

5252
```python
53-
53+
class Solution:
54+
def maxHappyGroups(self, batchSize: int, groups: List[int]) -> int:
55+
@cache
56+
def dfs(state, x):
57+
if state == mask:
58+
return 0
59+
vis = [False] * batchSize
60+
res = 0
61+
for i, v in enumerate(g):
62+
if state >> i & 1 == 0 and not vis[v]:
63+
vis[v] = True
64+
y = (x + v) % batchSize
65+
res = max(res, dfs(state | 1 << i, y))
66+
return res + (x == 0)
67+
68+
g = [v % batchSize for v in groups if v % batchSize]
69+
mask = (1 << len(g)) - 1
70+
return len(groups) - len(g) + dfs(0, 0)
5471
```
5572

5673
### **Java**

solution/1800-1899/1815.Maximum Number of Groups Getting Fresh Donuts/README_EN.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,24 @@
4242
### **Python3**
4343

4444
```python
45-
45+
class Solution:
46+
def maxHappyGroups(self, batchSize: int, groups: List[int]) -> int:
47+
@cache
48+
def dfs(state, x):
49+
if state == mask:
50+
return 0
51+
vis = [False] * batchSize
52+
res = 0
53+
for i, v in enumerate(g):
54+
if state >> i & 1 == 0 and not vis[v]:
55+
vis[v] = True
56+
y = (x + v) % batchSize
57+
res = max(res, dfs(state | 1 << i, y))
58+
return res + (x == 0)
59+
60+
g = [v % batchSize for v in groups if v % batchSize]
61+
mask = (1 << len(g)) - 1
62+
return len(groups) - len(g) + dfs(0, 0)
4663
```
4764

4865
### **Java**
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def maxHappyGroups(self, batchSize: int, groups: List[int]) -> int:
3+
@cache
4+
def dfs(state, x):
5+
if state == mask:
6+
return 0
7+
vis = [False] * batchSize
8+
res = 0
9+
for i, v in enumerate(g):
10+
if state >> i & 1 == 0 and not vis[v]:
11+
vis[v] = True
12+
y = (x + v) % batchSize
13+
res = max(res, dfs(state | 1 << i, y))
14+
return res + (x == 0)
15+
16+
g = [v % batchSize for v in groups if v % batchSize]
17+
mask = (1 << len(g)) - 1
18+
return len(groups) - len(g) + dfs(0, 0)

solution/1800-1899/1816.Truncate Sentence/README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ s 中的单词为 ["What", "is" "the", "solution", "to", "this", "problem"]
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:模拟**
61+
62+
我们从前往后遍历字符串 $s$,对于当前遍历到的字符 $s[i]$,如果 $s[i]$ 是空格,那么 $k$ 自减 1,当 $k$ 为 0 时,说明已经截取了 $k$ 个单词,截取字符串 $s[0:i]$ 返回即可。
63+
64+
遍历结束,返回 $s$ 即可。
65+
66+
时间复杂度 $O(n)$,其中 $n$ 为字符串 $s$ 的长度。忽略答案的空间消耗,空间复杂度 $O(1)$。
67+
6068
<!-- tabs:start -->
6169

6270
### **Python3**
@@ -73,8 +81,7 @@ class Solution:
7381
class Solution:
7482
def truncateSentence(self, s: str, k: int) -> str:
7583
for i, c in enumerate(s):
76-
if c == ' ':
77-
k -= 1
84+
k -= c == ' '
7885
if k == 0:
7986
return s[:i]
8087
return s

solution/1800-1899/1816.Truncate Sentence/README_EN.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ class Solution:
6868
class Solution:
6969
def truncateSentence(self, s: str, k: int) -> str:
7070
for i, c in enumerate(s):
71-
if c == ' ':
72-
k -= 1
71+
k -= c == ' '
7372
if k == 0:
7473
return s[:i]
7574
return s
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
class Solution:
22
def truncateSentence(self, s: str, k: int) -> str:
33
for i, c in enumerate(s):
4-
if c == ' ':
5-
k -= 1
4+
k -= c == ' '
65
if k == 0:
76
return s[:i]
87
return s

solution/2200-2299/2293.Min Max Game/README.md

Lines changed: 44 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@
6060

6161
**方法一:模拟**
6262

63+
根据题意,我们可以模拟整个过程,最后剩下的数字即为答案。在实现上,我们不需要额外创建数组,直接在原数组上进行操作即可。
64+
65+
时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度。
66+
6367
<!-- tabs:start -->
6468

6569
### **Python3**
@@ -70,17 +74,12 @@
7074
class Solution:
7175
def minMaxGame(self, nums: List[int]) -> int:
7276
n = len(nums)
73-
if n == 1:
74-
return nums[0]
75-
t = []
76-
for i in range(n >> 1):
77-
v = (
78-
max(nums[i << 1], nums[i << 1 | 1])
79-
if i & 1
80-
else min(nums[i << 1], nums[i << 1 | 1])
81-
)
82-
t.append(v)
83-
return self.minMaxGame(t)
77+
while n > 1:
78+
n >>= 1
79+
for i in range(n):
80+
a, b = nums[i << 1], nums[i << 1 | 1]
81+
nums[i] = min(a, b) if i % 2 == 0 else max(a, b)
82+
return nums[0]
8483
```
8584

8685
### **Java**
@@ -90,16 +89,14 @@ class Solution:
9089
```java
9190
class Solution {
9291
public int minMaxGame(int[] nums) {
93-
int n = nums.length;
94-
if (n == 1) {
95-
return nums[0];
96-
}
97-
int[] t = new int[n >> 1];
98-
for (int i = 0; i < t.length; ++i) {
99-
int a = nums[i << 1], b = nums[i << 1 | 1];
100-
t[i] = (i & 1) == 1 ? Math.max(a, b) : Math.min(a, b);
92+
for (int n = nums.length; n > 1;) {
93+
n >>= 1;
94+
for (int i = 0; i < n; ++i) {
95+
int a = nums[i << 1], b = nums[i << 1 | 1];
96+
nums[i] = i % 2 == 0 ? Math.min(a, b) : Math.max(a, b);
97+
}
10198
}
102-
return minMaxGame(t);
99+
return nums[0];
103100
}
104101
}
105102
```
@@ -110,14 +107,14 @@ class Solution {
110107
class Solution {
111108
public:
112109
int minMaxGame(vector<int>& nums) {
113-
int n = nums.size();
114-
if (n == 1) return nums[0];
115-
vector<int> t(n >> 1);
116-
for (int i = 0; i < t.size(); ++i) {
117-
int a = nums[i << 1], b = nums[i << 1 | 1];
118-
t[i] = (i & 1) == 1 ? max(a, b) : min(a, b);
110+
for (int n = nums.size(); n > 1;) {
111+
n >>= 1;
112+
for (int i = 0; i < n; ++i) {
113+
int a = nums[i << 1], b = nums[i << 1 | 1];
114+
nums[i] = i % 2 == 0 ? min(a, b) : max(a, b);
115+
}
119116
}
120-
return minMaxGame(t);
117+
return nums[0];
121118
}
122119
};
123120
```
@@ -126,31 +123,29 @@ public:
126123
127124
```go
128125
func minMaxGame(nums []int) int {
129-
n := len(nums)
130-
if n == 1 {
131-
return nums[0]
132-
}
133-
var t []int
134-
for i := 0; i < n>>1; i++ {
135-
a, b := nums[i<<1], nums[i<<1|1]
136-
if (i & 1) == 1 {
137-
t = append(t, max(a, b))
138-
} else {
139-
t = append(t, min(a, b))
126+
for n := len(nums); n > 1; {
127+
n >>= 1
128+
for i := 0; i < n; i++ {
129+
a, b := nums[i<<1], nums[i<<1|1]
130+
if i%2 == 0 {
131+
nums[i] = min(a, b)
132+
} else {
133+
nums[i] = max(a, b)
134+
}
140135
}
141136
}
142-
return minMaxGame(t)
137+
return nums[0]
143138
}
144139
145-
func max(a, b int) int {
146-
if a > b {
140+
func min(a, b int) int {
141+
if a < b {
147142
return a
148143
}
149144
return b
150145
}
151146
152-
func min(a, b int) int {
153-
if a < b {
147+
func max(a, b int) int {
148+
if a > b {
154149
return a
155150
}
156151
return b
@@ -161,17 +156,13 @@ func min(a, b int) int {
161156

162157
```ts
163158
function minMaxGame(nums: number[]): number {
164-
while (nums.length > 1) {
165-
let n = nums.length;
166-
let tmp = [];
167-
for (let i = 0; i < n; i += 2) {
168-
if (i % 4 == 2) {
169-
tmp.push(Math.max(nums[i], nums[i + 1]));
170-
} else {
171-
tmp.push(Math.min(nums[i], nums[i + 1]));
172-
}
159+
for (let n = nums.length; n > 1; ) {
160+
n >>= 1;
161+
for (let i = 0; i < n; ++i) {
162+
const a = nums[i << 1];
163+
const b = nums[(i << 1) | 1];
164+
nums[i] = i % 2 == 0 ? Math.min(a, b) : Math.max(a, b);
173165
}
174-
nums = tmp;
175166
}
176167
return nums[0];
177168
}

0 commit comments

Comments
 (0)