Skip to content

Commit ff132bc

Browse files
authored
feat: add rust solution to lc problem: No.0494 (#1227)
1 parent 6d7b430 commit ff132bc

File tree

3 files changed

+182
-0
lines changed

3 files changed

+182
-0
lines changed

solution/0400-0499/0494.Target Sum/README.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,79 @@ public:
211211
};
212212
```
213213

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+
214287
### **Go**
215288

216289
```go

solution/0400-0499/0494.Target Sum/README_EN.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,79 @@ public:
195195
};
196196
```
197197

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+
198271
### **Go**
199272

200273
```go
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
}

0 commit comments

Comments
 (0)