File tree Expand file tree Collapse file tree 3 files changed +182
-0
lines changed
solution/0400-0499/0494.Target Sum Expand file tree Collapse file tree 3 files changed +182
-0
lines changed Original file line number Diff line number Diff line change @@ -211,6 +211,79 @@ public:
211
211
};
212
212
```
213
213
214
+ ### ** Rust**
215
+
216
+ ``` rust
217
+ impl Solution {
218
+ #[allow(dead_code)]
219
+ pub fn find_target_sum_ways (nums : Vec <i32 >, target : i32 ) -> i32 {
220
+ let mut sum = 0 ;
221
+ for e in & nums {
222
+ sum += * e ;
223
+ }
224
+
225
+ // -x + (sum - x) = target <-> -2 * x + sum = target <-> 2 * x = sum - target
226
+ if sum < target || (sum - target ) % 2 != 0 {
227
+ // There is no way to get any expression in this case
228
+ return 0 ;
229
+ }
230
+ let n = nums . len ();
231
+ let m = (sum - target ) / 2 ;
232
+
233
+ let mut dp : Vec <Vec <i32 >> = vec! [vec! [0 ; m as usize + 1 ]; n + 1 ];
234
+
235
+ // Initialize the dp vector
236
+ dp [0 ][0 ] = 1 ;
237
+
238
+ // Begin the actual dp phase
239
+ for i in 1 ..= n {
240
+ for j in 0 ..= m as usize {
241
+ // nums[i - 1] is not included
242
+ dp [i ][j ] = dp [i - 1 ][j ];
243
+ if nums [i - 1 ] <= j as i32 {
244
+ // nums[i - 1] is included
245
+ dp [i ][j ] += dp [i - 1 ][j - nums [i - 1 ] as usize ];
246
+ }
247
+ }
248
+ }
249
+
250
+ dp [n ][m as usize ]
251
+ }
252
+ }
253
+ ```
254
+
255
+ ``` rust
256
+ impl Solution {
257
+ #[allow(dead_code)]
258
+ pub fn find_target_sum_ways (nums : Vec <i32 >, target : i32 ) -> i32 {
259
+ let mut sum = 0 ;
260
+ for e in & nums {
261
+ sum += * e ;
262
+ }
263
+
264
+ if sum < target || (sum - target ) % 2 != 0 {
265
+ // Just directly return
266
+ return 0 ;
267
+ }
268
+
269
+ let n = ((sum - target ) / 2 ) as usize ;
270
+ let mut dp : Vec <i32 > = vec! [0 ; n + 1 ];
271
+
272
+ // Initialize the dp vector
273
+ dp [0 ] = 1 ;
274
+
275
+ // Begin the actual dp phase
276
+ for e in & nums {
277
+ for i in (* e as usize ..= n ). rev () {
278
+ dp [i ] += dp [i - * e as usize ];
279
+ }
280
+ }
281
+
282
+ dp [n ]
283
+ }
284
+ }
285
+ ```
286
+
214
287
### ** Go**
215
288
216
289
``` go
Original file line number Diff line number Diff line change @@ -195,6 +195,79 @@ public:
195
195
};
196
196
```
197
197
198
+ ### ** Rust**
199
+
200
+ ``` rust
201
+ impl Solution {
202
+ #[allow(dead_code)]
203
+ pub fn find_target_sum_ways (nums : Vec <i32 >, target : i32 ) -> i32 {
204
+ let mut sum = 0 ;
205
+ for e in & nums {
206
+ sum += * e ;
207
+ }
208
+
209
+ // -x + (sum - x) = target <-> -2 * x + sum = target <-> 2 * x = sum - target
210
+ if sum < target || (sum - target ) % 2 != 0 {
211
+ // There is no way to get any expression in this case
212
+ return 0 ;
213
+ }
214
+ let n = nums . len ();
215
+ let m = (sum - target ) / 2 ;
216
+
217
+ let mut dp : Vec <Vec <i32 >> = vec! [vec! [0 ; m as usize + 1 ]; n + 1 ];
218
+
219
+ // Initialize the dp vector
220
+ dp [0 ][0 ] = 1 ;
221
+
222
+ // Begin the actual dp phase
223
+ for i in 1 ..= n {
224
+ for j in 0 ..= m as usize {
225
+ // nums[i - 1] is not included
226
+ dp [i ][j ] = dp [i - 1 ][j ];
227
+ if nums [i - 1 ] <= j as i32 {
228
+ // nums[i - 1] is included
229
+ dp [i ][j ] += dp [i - 1 ][j - nums [i - 1 ] as usize ];
230
+ }
231
+ }
232
+ }
233
+
234
+ dp [n ][m as usize ]
235
+ }
236
+ }
237
+ ```
238
+
239
+ ``` rust
240
+ impl Solution {
241
+ #[allow(dead_code)]
242
+ pub fn find_target_sum_ways (nums : Vec <i32 >, target : i32 ) -> i32 {
243
+ let mut sum = 0 ;
244
+ for e in & nums {
245
+ sum += * e ;
246
+ }
247
+
248
+ if sum < target || (sum - target ) % 2 != 0 {
249
+ // Just directly return
250
+ return 0 ;
251
+ }
252
+
253
+ let n = ((sum - target ) / 2 ) as usize ;
254
+ let mut dp : Vec <i32 > = vec! [0 ; n + 1 ];
255
+
256
+ // Initialize the dp vector
257
+ dp [0 ] = 1 ;
258
+
259
+ // Begin the actual dp phase
260
+ for e in & nums {
261
+ for i in (* e as usize ..= n ). rev () {
262
+ dp [i ] += dp [i - * e as usize ];
263
+ }
264
+ }
265
+
266
+ dp [n ]
267
+ }
268
+ }
269
+ ```
270
+
198
271
### ** Go**
199
272
200
273
``` go
Original file line number Diff line number Diff line change
1
+ impl Solution {
2
+ #[ allow( dead_code) ]
3
+ pub fn find_target_sum_ways ( nums : Vec < i32 > , target : i32 ) -> i32 {
4
+ let mut sum = 0 ;
5
+ for e in & nums {
6
+ sum += * e;
7
+ }
8
+
9
+ // -x + (sum - x) = target <-> -2 * x + sum = target <-> 2 * x = sum - target
10
+ if sum < target || ( sum - target) % 2 != 0 {
11
+ // There is no way to get any expression in this case
12
+ return 0 ;
13
+ }
14
+ let n = nums. len ( ) ;
15
+ let m = ( sum - target) / 2 ;
16
+
17
+ let mut dp: Vec < Vec < i32 > > = vec ! [ vec![ 0 ; m as usize + 1 ] ; n + 1 ] ;
18
+
19
+ // Initialize the dp vector
20
+ dp[ 0 ] [ 0 ] = 1 ;
21
+
22
+ // Begin the actual dp phase
23
+ for i in 1 ..=n {
24
+ for j in 0 ..=m as usize {
25
+ // nums[i - 1] is not included
26
+ dp[ i] [ j] = dp[ i - 1 ] [ j] ;
27
+ if nums[ i - 1 ] <= j as i32 {
28
+ // nums[i - 1] is included
29
+ dp[ i] [ j] += dp[ i - 1 ] [ j - nums[ i - 1 ] as usize ] ;
30
+ }
31
+ }
32
+ }
33
+
34
+ dp[ n] [ m as usize ]
35
+ }
36
+ }
You can’t perform that action at this time.
0 commit comments