Skip to content

Commit c2d555d

Browse files
authored
feat: update solutions to lc problem: No.1510 (#5344)
1 parent e2a632d commit c2d555d

10 files changed

Lines changed: 305 additions & 88 deletions

File tree

solution/1500-1599/1510.Stone Game IV/README.md

Lines changed: 94 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -101,19 +101,16 @@ tags:
101101
#### Python3
102102

103103
```python
104+
@cache
105+
def dfs(i: int) -> bool:
106+
if i <= 0:
107+
return False
108+
k = isqrt(i)
109+
return any(not dfs(i - j * j) for j in range(1, k + 1))
110+
111+
104112
class Solution:
105113
def winnerSquareGame(self, n: int) -> bool:
106-
@cache
107-
def dfs(i: int) -> bool:
108-
if i == 0:
109-
return False
110-
j = 1
111-
while j * j <= i:
112-
if not dfs(i - j * j):
113-
return True
114-
j += 1
115-
return False
116-
117114
return dfs(n)
118115
```
119116

@@ -135,7 +132,8 @@ class Solution {
135132
if (f[i] != null) {
136133
return f[i];
137134
}
138-
for (int j = 1; j <= i / j; ++j) {
135+
int k = (int) Math.sqrt(i);
136+
for (int j = 1; j <= k; j++) {
139137
if (!dfs(i - j * j)) {
140138
return f[i] = true;
141139
}
@@ -151,24 +149,26 @@ class Solution {
151149
class Solution {
152150
public:
153151
bool winnerSquareGame(int n) {
154-
int f[n + 1];
155-
memset(f, 0, sizeof(f));
156-
function<bool(int)> dfs = [&](int i) -> bool {
152+
vector<int> f(n + 1, -1);
153+
154+
auto dfs = [&](this auto&& dfs, int i) -> bool {
157155
if (i <= 0) {
158156
return false;
159157
}
160-
if (f[i] != 0) {
161-
return f[i] == 1;
158+
if (f[i] != -1) {
159+
return f[i];
162160
}
163-
for (int j = 1; j <= i / j; ++j) {
161+
162+
int k = sqrt(i);
163+
for (int j = 1; j <= k; j++) {
164164
if (!dfs(i - j * j)) {
165-
f[i] = 1;
166-
return true;
165+
return f[i] = true;
167166
}
168167
}
169-
f[i] = -1;
170-
return false;
168+
169+
return f[i] = false;
171170
};
171+
172172
return dfs(n);
173173
}
174174
};
@@ -178,7 +178,8 @@ public:
178178

179179
```go
180180
func winnerSquareGame(n int) bool {
181-
f := make([]int, n+1)
181+
f := make([]int8, n+1)
182+
182183
var dfs func(int) bool
183184
dfs = func(i int) bool {
184185
if i <= 0 {
@@ -187,7 +188,8 @@ func winnerSquareGame(n int) bool {
187188
if f[i] != 0 {
188189
return f[i] == 1
189190
}
190-
for j := 1; j <= i/j; j++ {
191+
k := int(math.Sqrt(float64(i)))
192+
for j := 1; j <= k; j++ {
191193
if !dfs(i - j*j) {
192194
f[i] = 1
193195
return true
@@ -196,6 +198,7 @@ func winnerSquareGame(n int) bool {
196198
f[i] = -1
197199
return false
198200
}
201+
199202
return dfs(n)
200203
}
201204
```
@@ -204,27 +207,66 @@ func winnerSquareGame(n int) bool {
204207

205208
```ts
206209
function winnerSquareGame(n: number): boolean {
207-
const f: number[] = new Array(n + 1).fill(0);
210+
const f = new Array<number>(n + 1).fill(-1);
211+
208212
const dfs = (i: number): boolean => {
209213
if (i <= 0) {
210214
return false;
211215
}
212-
if (f[i] !== 0) {
216+
if (f[i] !== -1) {
213217
return f[i] === 1;
214218
}
215-
for (let j = 1; j * j <= i; ++j) {
219+
220+
const k = Math.floor(Math.sqrt(i));
221+
for (let j = 1; j <= k; j++) {
216222
if (!dfs(i - j * j)) {
217223
f[i] = 1;
218224
return true;
219225
}
220226
}
221-
f[i] = -1;
227+
228+
f[i] = 0;
222229
return false;
223230
};
231+
224232
return dfs(n);
225233
}
226234
```
227235

236+
#### Rust
237+
238+
```rust
239+
impl Solution {
240+
pub fn winner_square_game(n: i32) -> bool {
241+
let mut f = vec![-1; (n + 1) as usize];
242+
243+
fn dfs(i: i32, f: &mut Vec<i8>) -> bool {
244+
if i <= 0 {
245+
return false;
246+
}
247+
248+
let idx = i as usize;
249+
if f[idx] != -1 {
250+
return f[idx] == 1;
251+
}
252+
253+
let k = (i as f64).sqrt() as i32;
254+
for j in 1..=k {
255+
if !dfs(i - j * j, f) {
256+
f[idx] = 1;
257+
return true;
258+
}
259+
}
260+
261+
f[idx] = 0;
262+
false
263+
}
264+
265+
dfs(n, &mut f)
266+
}
267+
}
268+
```
269+
228270
<!-- tabs:end -->
229271

230272
<!-- solution:end -->
@@ -343,6 +385,30 @@ function winnerSquareGame(n: number): boolean {
343385
}
344386
```
345387

388+
#### Rust
389+
390+
```rust
391+
impl Solution {
392+
pub fn winner_square_game(n: i32) -> bool {
393+
let n = n as usize;
394+
let mut f = vec![false; n + 1];
395+
396+
for i in 1..=n {
397+
let mut j = 1;
398+
while j <= i / j {
399+
if !f[i - j * j] {
400+
f[i] = true;
401+
break;
402+
}
403+
j += 1;
404+
}
405+
}
406+
407+
f[n]
408+
}
409+
}
410+
```
411+
346412
<!-- tabs:end -->
347413

348414
<!-- solution:end -->

0 commit comments

Comments
 (0)