@@ -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+
104112class 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 {
151149class Solution {
152150public:
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
180180func 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
206209function 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