Skip to content

Commit 29d2d0e

Browse files
committed
feat: update solutions to lc problems
* No.0416.Partition Equal Subset Sum * No.0494.Target Sum * No.1049.Last Stone Weight II
1 parent e7ac40e commit 29d2d0e

21 files changed

+514
-259
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
- [两个字符串的删除操作](/solution/0500-0599/0583.Delete%20Operation%20for%20Two%20Strings/README.md) - 线性 DP、最长公共子序列模型
8080
- [目标和](/solution/0400-0499/0494.Target%20Sum/README.md) - 0-1 背包问题
8181
- [分割等和子集](/solution/0400-0499/0416.Partition%20Equal%20Subset%20Sum/README.md) - 0-1 背包问题
82+
- [最后一块石头的重量 II](/solution/1000-1099/1049.Last%20Stone%20Weight%20II/README.md) - 0-1 背包问题
8283
<!-- 背包问题、状态机模型、状压DP、区间DP、树形DP、数位DP 待补充 -->
8384

8485
### 4. 高级数据结构

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
7676
- [Delete Operation for Two Strings](/solution/0500-0599/0583.Delete%20Operation%20for%20Two%20Strings/README_EN.md) - Linear problem, LCS
7777
- [Target Sum](/solution/0400-0499/0494.Target%20Sum/README_EN.md) - 0-1 Knapsack problem
7878
- [Partition Equal Subset Sum](/solution/0400-0499/0416.Partition%20Equal%20Subset%20Sum/README_EN.md) - 0-1 Knapsack problem
79+
- [Last Stone Weight II](/solution/1000-1099/1049.Last%20Stone%20Weight%20II/README_EN.md) - 0-1 Knapsack problem
7980

8081
### 4. Advanced Data Structures
8182

solution/0400-0499/0416.Partition Equal Subset Sum/README.md

+17-20
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ class Solution:
7979
s = sum(nums)
8080
if s % 2 != 0:
8181
return False
82-
m, n = len(nums), s >> 1
82+
n = s >> 1
8383
dp = [False] * (n + 1)
8484
dp[0] = True
85-
for i in range(1, m + 1):
86-
for j in range(n, nums[i - 1] - 1, -1):
87-
dp[j] = dp[j] or dp[j - nums[i - 1]]
85+
for v in nums:
86+
for j in range(n, v - 1, -1):
87+
dp[j] = dp[j] or dp[j - v]
8888
return dp[-1]
8989
```
9090

@@ -151,13 +151,12 @@ class Solution {
151151
if (s % 2 != 0) {
152152
return false;
153153
}
154-
int m = nums.length;
155154
int n = s >> 1;
156155
boolean[] dp = new boolean[n + 1];
157156
dp[0] = true;
158-
for (int i = 1; i <= m; ++i) {
159-
for (int j = n; j >= nums[i - 1]; --j) {
160-
dp[j] = dp[j] || dp[j - nums[i - 1]];
157+
for (int v : nums) {
158+
for (int j = n; j >= v; --j) {
159+
dp[j] = dp[j] || dp[j - v];
161160
}
162161
}
163162
return dp[n];
@@ -171,8 +170,7 @@ class Solution {
171170
class Solution {
172171
public:
173172
bool canPartition(vector<int>& nums) {
174-
int s = 0;
175-
for (int& v : nums) s += v;
173+
int s = accumulate(nums.begin(), nums.end(), 0);
176174
if (s % 2 != 0) return false;
177175
int m = nums.size(), n = s >> 1;
178176
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
@@ -194,15 +192,14 @@ public:
194192
class Solution {
195193
public:
196194
bool canPartition(vector<int>& nums) {
197-
int s = 0;
198-
for (int& v : nums) s += v;
195+
int s = accumulate(nums.begin(), nums.end(), 0);
199196
if (s % 2 != 0) return false;
200-
int m = nums.size(), n = s >> 1;
197+
int n = s >> 1;
201198
vector<bool> dp(n + 1);
202199
dp[0] = true;
203-
for (int i = 1; i <= m; ++i)
204-
for (int j = n; j >= nums[i - 1]; --j)
205-
dp[j] = dp[j] || dp[j - nums[i - 1]];
200+
for (int& v : nums)
201+
for (int j = n; j >= v; --j)
202+
dp[j] = dp[j] || dp[j - v];
206203
return dp[n];
207204
}
208205
};
@@ -246,12 +243,12 @@ func canPartition(nums []int) bool {
246243
if s%2 != 0 {
247244
return false
248245
}
249-
m, n := len(nums), s>>1
246+
n := s >> 1
250247
dp := make([]bool, n+1)
251248
dp[0] = true
252-
for i := 1; i <= m; i++ {
253-
for j := n; j >= nums[i-1]; j-- {
254-
dp[j] = dp[j] || dp[j-nums[i-1]]
249+
for _, v := range nums {
250+
for j := n; j >= v; j-- {
251+
dp[j] = dp[j] || dp[j-v]
255252
}
256253
}
257254
return dp[n]

solution/0400-0499/0416.Partition Equal Subset Sum/README_EN.md

+17-20
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ class Solution:
6262
s = sum(nums)
6363
if s % 2 != 0:
6464
return False
65-
m, n = len(nums), s >> 1
65+
n = s >> 1
6666
dp = [False] * (n + 1)
6767
dp[0] = True
68-
for i in range(1, m + 1):
69-
for j in range(n, nums[i - 1] - 1, -1):
70-
dp[j] = dp[j] or dp[j - nums[i - 1]]
68+
for v in nums:
69+
for j in range(n, v - 1, -1):
70+
dp[j] = dp[j] or dp[j - v]
7171
return dp[-1]
7272
```
7373

@@ -130,13 +130,12 @@ class Solution {
130130
if (s % 2 != 0) {
131131
return false;
132132
}
133-
int m = nums.length;
134133
int n = s >> 1;
135134
boolean[] dp = new boolean[n + 1];
136135
dp[0] = true;
137-
for (int i = 1; i <= m; ++i) {
138-
for (int j = n; j >= nums[i - 1]; --j) {
139-
dp[j] = dp[j] || dp[j - nums[i - 1]];
136+
for (int v : nums) {
137+
for (int j = n; j >= v; --j) {
138+
dp[j] = dp[j] || dp[j - v];
140139
}
141140
}
142141
return dp[n];
@@ -150,8 +149,7 @@ class Solution {
150149
class Solution {
151150
public:
152151
bool canPartition(vector<int>& nums) {
153-
int s = 0;
154-
for (int& v : nums) s += v;
152+
int s = accumulate(nums.begin(), nums.end(), 0);
155153
if (s % 2 != 0) return false;
156154
int m = nums.size(), n = s >> 1;
157155
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
@@ -173,15 +171,14 @@ public:
173171
class Solution {
174172
public:
175173
bool canPartition(vector<int>& nums) {
176-
int s = 0;
177-
for (int& v : nums) s += v;
174+
int s = accumulate(nums.begin(), nums.end(), 0);
178175
if (s % 2 != 0) return false;
179-
int m = nums.size(), n = s >> 1;
176+
int n = s >> 1;
180177
vector<bool> dp(n + 1);
181178
dp[0] = true;
182-
for (int i = 1; i <= m; ++i)
183-
for (int j = n; j >= nums[i - 1]; --j)
184-
dp[j] = dp[j] || dp[j - nums[i - 1]];
179+
for (int& v : nums)
180+
for (int j = n; j >= v; --j)
181+
dp[j] = dp[j] || dp[j - v];
185182
return dp[n];
186183
}
187184
};
@@ -225,12 +222,12 @@ func canPartition(nums []int) bool {
225222
if s%2 != 0 {
226223
return false
227224
}
228-
m, n := len(nums), s>>1
225+
n := s >> 1
229226
dp := make([]bool, n+1)
230227
dp[0] = true
231-
for i := 1; i <= m; i++ {
232-
for j := n; j >= nums[i-1]; j-- {
233-
dp[j] = dp[j] || dp[j-nums[i-1]]
228+
for _, v := range nums {
229+
for j := n; j >= v; j-- {
230+
dp[j] = dp[j] || dp[j-v]
234231
}
235232
}
236233
return dp[n]
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
class Solution {
22
public:
33
bool canPartition(vector<int>& nums) {
4-
int s = 0;
5-
for (int& v : nums) s += v;
4+
int s = accumulate(nums.begin(), nums.end(), 0);
65
if (s % 2 != 0) return false;
7-
int m = nums.size(), n = s >> 1;
6+
int n = s >> 1;
87
vector<bool> dp(n + 1);
98
dp[0] = true;
10-
for (int i = 1; i <= m; ++i)
11-
for (int j = n; j >= nums[i - 1]; --j)
12-
dp[j] = dp[j] || dp[j - nums[i - 1]];
9+
for (int& v : nums)
10+
for (int j = n; j >= v; --j)
11+
dp[j] = dp[j] || dp[j - v];
1312
return dp[n];
1413
}
1514
};

solution/0400-0499/0416.Partition Equal Subset Sum/Solution.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ func canPartition(nums []int) bool {
66
if s%2 != 0 {
77
return false
88
}
9-
m, n := len(nums), s>>1
9+
n := s >> 1
1010
dp := make([]bool, n+1)
1111
dp[0] = true
12-
for i := 1; i <= m; i++ {
13-
for j := n; j >= nums[i-1]; j-- {
14-
dp[j] = dp[j] || dp[j-nums[i-1]]
12+
for _, v := range nums {
13+
for j := n; j >= v; j-- {
14+
dp[j] = dp[j] || dp[j-v]
1515
}
1616
}
1717
return dp[n]

solution/0400-0499/0416.Partition Equal Subset Sum/Solution.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ public boolean canPartition(int[] nums) {
77
if (s % 2 != 0) {
88
return false;
99
}
10-
int m = nums.length;
1110
int n = s >> 1;
1211
boolean[] dp = new boolean[n + 1];
1312
dp[0] = true;
14-
for (int i = 1; i <= m; ++i) {
15-
for (int j = n; j >= nums[i - 1]; --j) {
16-
dp[j] = dp[j] || dp[j - nums[i - 1]];
13+
for (int v : nums) {
14+
for (int j = n; j >= v; --j) {
15+
dp[j] = dp[j] || dp[j - v];
1716
}
1817
}
1918
return dp[n];

solution/0400-0499/0416.Partition Equal Subset Sum/Solution.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ def canPartition(self, nums: List[int]) -> bool:
33
s = sum(nums)
44
if s % 2 != 0:
55
return False
6-
m, n = len(nums), s >> 1
6+
n = s >> 1
77
dp = [False] * (n + 1)
88
dp[0] = True
9-
for i in range(1, m + 1):
10-
for j in range(n, nums[i - 1] - 1, -1):
11-
dp[j] = dp[j] or dp[j - nums[i - 1]]
9+
for v in nums:
10+
for j in range(n, v - 1, -1):
11+
dp[j] = dp[j] or dp[j - v]
1212
return dp[-1]

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

+22-29
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ class Solution:
7373
s = sum(nums)
7474
if s < target or (s - target) % 2 != 0:
7575
return 0
76-
m, n = len(nums) + 1, (s - target) // 2 + 1
77-
dp = [[0] * n for _ in range(m)]
76+
m, n = len(nums), (s - target) // 2
77+
dp = [[0] * (n + 1) for _ in range(m + 1)]
7878
dp[0][0] = 1
79-
for i in range(1, m):
80-
for j in range(n):
79+
for i in range(1, m + 1):
80+
for j in range(n + 1):
8181
dp[i][j] = dp[i - 1][j]
8282
if nums[i - 1] <= j:
8383
dp[i][j] += dp[i - 1][j - nums[i - 1]]
@@ -92,12 +92,12 @@ class Solution:
9292
s = sum(nums)
9393
if s < target or (s - target) % 2 != 0:
9494
return 0
95-
m, n = len(nums) + 1, (s - target) // 2 + 1
96-
dp = [0] * n
95+
n = (s - target) // 2
96+
dp = [0] * (n + 1)
9797
dp[0] = 1
98-
for i in range(1, m):
99-
for j in range(n - 1, nums[i - 1] - 1, -1):
100-
dp[j] += dp[j - nums[i - 1]]
98+
for v in nums:
99+
for j in range(n, v - 1, -1):
100+
dp[j] += dp[j - v]
101101
return dp[-1]
102102
```
103103

@@ -159,13 +159,12 @@ class Solution {
159159
if (s < target || (s - target) % 2 != 0) {
160160
return 0;
161161
}
162-
int m = nums.length;
163162
int n = (s - target) / 2;
164163
int[] dp = new int[n + 1];
165164
dp[0] = 1;
166-
for (int i = 1; i <= m; ++i) {
167-
for (int j = n; j >= nums[i - 1]; --j) {
168-
dp[j] += dp[j - nums[i - 1]];
165+
for (int v : nums) {
166+
for (int j = n; j >= v; --j) {
167+
dp[j] += dp[j - v];
169168
}
170169
}
171170
return dp[n];
@@ -179,8 +178,7 @@ class Solution {
179178
class Solution {
180179
public:
181180
int findTargetSumWays(vector<int>& nums, int target) {
182-
int s = 0;
183-
for (int& v : nums) s += v;
181+
int s = accumulate(nums.begin(), nums.end(), 0);
184182
if (s < target || (s - target) % 2 != 0) return 0;
185183
int m = nums.size(), n = (s - target) / 2;
186184
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
@@ -202,19 +200,14 @@ public:
202200
class Solution {
203201
public:
204202
int findTargetSumWays(vector<int>& nums, int target) {
205-
int s = 0;
206-
for (int& v : nums) s += v;
203+
int s = accumulate(nums.begin(), nums.end(), 0);
207204
if (s < target || (s - target) % 2 != 0) return 0;
208-
int m = nums.size(), n = (s - target) / 2;
205+
int n = (s - target) / 2;
209206
vector<int> dp(n + 1);
210207
dp[0] = 1;
211-
for (int i = 1; i <= m; ++i)
212-
{
213-
for (int j = n; j >= nums[i - 1]; --j)
214-
{
215-
dp[j] += dp[j - nums[i - 1]];
216-
}
217-
}
208+
for (int& v : nums)
209+
for (int j = n; j >= v; --j)
210+
dp[j] += dp[j - v];
218211
return dp[n];
219212
}
220213
};
@@ -258,12 +251,12 @@ func findTargetSumWays(nums []int, target int) int {
258251
if s < target || (s-target)%2 != 0 {
259252
return 0
260253
}
261-
m, n := len(nums), (s-target)/2
254+
n := (s - target) / 2
262255
dp := make([]int, n+1)
263256
dp[0] = 1
264-
for i := 1; i <= m; i++ {
265-
for j := n; j >= nums[i-1]; j-- {
266-
dp[j] += dp[j-nums[i-1]]
257+
for _, v := range nums {
258+
for j := n; j >= v; j-- {
259+
dp[j] += dp[j-v]
267260
}
268261
}
269262
return dp[n]

0 commit comments

Comments
 (0)