Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f3c9f14

Browse files
committed
feat: add solutions to lc/lcof2 problems
* Update solutions to lc No.0188.Best Time to Buy and Sell Stock IV, fix doocs#623 * Add solutions to lcof2 No.102.Target Sum
1 parent 8fac1f9 commit f3c9f14

File tree

13 files changed

+539
-90
lines changed

13 files changed

+539
-90
lines changed

‎lcof2/剑指 Offer II 102. 加减的目标值/README.md‎

Lines changed: 197 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,222 @@
5151

5252
<p><meta charset="UTF-8" />注意:本题与主站 494&nbsp;题相同:&nbsp;<a href="https://leetcode-cn.com/problems/target-sum/">https://leetcode-cn.com/problems/target-sum/</a></p>
5353

54-
5554
## 解法
5655

5756
<!-- 这里可写通用的实现逻辑 -->
5857

58+
题目可以转换为 `0-1` 背包问题,只不过下标可能会出现负数,需要特殊处理。
59+
60+
也可以用 DFS 记忆化搜索。
61+
5962
<!-- tabs:start -->
6063

6164
### **Python3**
6265

63-
<!-- 这里可写当前语言的特殊实现逻辑 -->
66+
**0-1 背包**
67+
68+
```python
69+
class Solution:
70+
def findTargetSumWays(self, nums: List[int], target: int) -> int:
71+
if target < -1000 or target > 1000:
72+
return 0
73+
n = len(nums)
74+
dp = [[0] * 2001 for i in range(n)]
75+
dp[0][nums[0] + 1000] += 1
76+
dp[0][-nums[0] + 1000] += 1
77+
for i in range(1, n):
78+
for j in range(-1000, 1001):
79+
if dp[i - 1][j + 1000] > 0:
80+
dp[i][j + nums[i] + 1000] += dp[i - 1][j + 1000]
81+
dp[i][j - nums[i] + 1000] += dp[i - 1][j + 1000]
82+
return dp[n - 1][target + 1000]
83+
```
84+
85+
设:添加 `-` 号的元素之和为 `x`,则添加 `+` 号的元素之和为 `s - x`,`s - x - x = target`,`2x = s - target`。需要满足 `s - target` 一定大于等于 0,并且能够被 2 整除。
6486

6587
```python
88+
class Solution:
89+
def findTargetSumWays(self, nums: List[int], target: int) -> int:
90+
s = sum(nums)
91+
if s - target < 0 or (s - target) % 2 != 0:
92+
return 0
93+
target = (s - target) // 2 + 1
94+
n = len(nums) + 1
95+
dp = [[0] * target for _ in range(n)]
96+
dp[0][0] = 1
97+
for i in range(1, n):
98+
for j in range(target):
99+
dp[i][j] = dp[i - 1][j]
100+
if nums[i - 1] <= j:
101+
dp[i][j] += dp[i - 1][j - nums[i - 1]]
102+
return dp[-1][-1]
103+
```
66104

105+
空间优化:
106+
107+
```python
108+
class Solution:
109+
def findTargetSumWays(self, nums: List[int], target: int) -> int:
110+
s = sum(nums)
111+
if s - target < 0 or (s - target) % 2 != 0:
112+
return 0
113+
target = (s - target) // 2 + 1
114+
n = len(nums) + 1
115+
dp = [0] * target
116+
dp[0] = 1
117+
for i in range(1, n):
118+
for j in range(target - 1, nums[i - 1] - 1, -1):
119+
dp[j] += dp[j - nums[i - 1]]
120+
return dp[-1]
121+
```
122+
123+
**DFS**
124+
125+
```python
126+
class Solution:
127+
def findTargetSumWays(self, nums: List[int], target: int) -> int:
128+
@lru_cache(None)
129+
def dfs(i, t):
130+
if i == n:
131+
if t == target:
132+
return 1
133+
return 0
134+
return dfs(i + 1, t + nums[i]) + dfs(i + 1, t - nums[i])
135+
136+
ans, n = 0, len(nums)
137+
return dfs(0, 0)
67138
```
68139

69140
### **Java**
70141

71142
<!-- 这里可写当前语言的特殊实现逻辑 -->
72143

73144
```java
145+
class Solution {
146+
public int findTargetSumWays(int[] nums, int target) {
147+
if (target < -1000 || target > 1000) {
148+
return 0;
149+
}
150+
151+
int n = nums.length;
152+
int[][] dp = new int[n][2001];
153+
154+
dp[0][nums[0] + 1000] += 1;
155+
dp[0][-nums[0] + 1000] += 1;
156+
157+
for (int i = 1; i < n; i++) {
158+
for (int j = -1000; j <= 1000; j++) {
159+
if (dp[i - 1][j + 1000] > 0) {
160+
dp[i][j + nums[i] + 1000] += dp[i - 1][j + 1000];
161+
dp[i][j - nums[i] + 1000] += dp[i - 1][j + 1000];
162+
}
163+
}
164+
}
165+
return dp[n - 1][target + 1000];
166+
}
167+
}
168+
```
169+
170+
空间优化:
171+
172+
```java
173+
class Solution {
174+
public int findTargetSumWays(int[] nums, int target) {
175+
int s = 0;
176+
for (int x : nums) {
177+
s += x;
178+
}
179+
if (s - target < 0 || (s - target) % 2 != 0) {
180+
return 0;
181+
}
182+
target = (s - target) / 2 + 1;
183+
int[] dp = new int[target];
184+
dp[0] = 1;
185+
for (int i = 1; i < nums.length + 1; ++i) {
186+
for (int j = target - 1; j >= nums[i - 1]; --j) {
187+
dp[j] += dp[j - nums[i - 1]];
188+
}
189+
}
190+
return dp[target - 1];
191+
}
192+
}
193+
```
194+
195+
### **C++**
196+
197+
空间优化:
198+
199+
```cpp
200+
class Solution {
201+
public:
202+
int findTargetSumWays(vector<int>& nums, int target) {
203+
int s = 0;
204+
for (int x : nums) s += x;
205+
if (s - target < 0 || (s - target) % 2 != 0) return 0;
206+
target = (s - target) / 2 + 1;
207+
vector<int> dp(target);
208+
dp[0] = 1;
209+
for (int i = 1; i < nums.size() + 1; ++i)
210+
{
211+
for (int j = target - 1; j >= nums[i - 1]; --j)
212+
{
213+
dp[j] += dp[j - nums[i - 1]];
214+
}
215+
}
216+
return dp[target - 1];
217+
}
218+
};
219+
```
220+
221+
### **Go**
222+
223+
<!-- 这里可写当前语言的特殊实现逻辑 -->
224+
225+
```go
226+
func findTargetSumWays(nums []int, target int) int {
227+
if target < -1000 || target > 1000 {
228+
return 0
229+
}
230+
n := len(nums)
231+
dp := make([][]int, n)
232+
for i := 0; i < n; i++ {
233+
dp[i] = make([]int, 2001)
234+
}
235+
dp[0][nums[0]+1000] += 1
236+
dp[0][-nums[0]+1000] += 1
237+
for i := 1; i < n; i++ {
238+
for j := -1000; j <= 1000; j++ {
239+
if dp[i-1][j+1000] > 0 {
240+
dp[i][j+nums[i]+1000] += dp[i-1][j+1000]
241+
dp[i][j-nums[i]+1000] += dp[i-1][j+1000]
242+
}
243+
}
244+
}
245+
return dp[n-1][target+1000]
246+
}
247+
```
74248

249+
空间优化:
250+
251+
```go
252+
func findTargetSumWays(nums []int, target int) int {
253+
s := 0
254+
for _, x := range nums {
255+
s += x
256+
}
257+
if s-target < 0 || (s-target)%2 != 0 {
258+
return 0
259+
}
260+
target = (s-target)/2 + 1
261+
dp := make([]int, target)
262+
dp[0] = 1
263+
for i := 1; i < len(nums)+1; i++ {
264+
for j := target - 1; j >= nums[i-1]; j-- {
265+
dp[j] += dp[j-nums[i-1]]
266+
}
267+
}
268+
return dp[target-1]
269+
}
75270
```
76271

77272
### **...**
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
int findTargetSumWays(vector<int>& nums, int target) {
4+
int s = 0;
5+
for (int x : nums) s += x;
6+
if (s - target < 0 || (s - target) % 2 != 0) return 0;
7+
target = (s - target) / 2 + 1;
8+
vector<int> dp(target);
9+
dp[0] = 1;
10+
for (int i = 1; i < nums.size() + 1; ++i)
11+
{
12+
for (int j = target - 1; j >= nums[i - 1]; --j)
13+
{
14+
dp[j] += dp[j - nums[i - 1]];
15+
}
16+
}
17+
return dp[target - 1];
18+
}
19+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func findTargetSumWays(nums []int, target int) int {
2+
s := 0
3+
for _, x := range nums {
4+
s += x
5+
}
6+
if s-target < 0 || (s-target)%2 != 0 {
7+
return 0
8+
}
9+
target = (s-target)/2 + 1
10+
dp := make([]int, target)
11+
dp[0] = 1
12+
for i := 1; i < len(nums)+1; i++ {
13+
for j := target - 1; j >= nums[i-1]; j-- {
14+
dp[j] += dp[j-nums[i-1]]
15+
}
16+
}
17+
return dp[target-1]
18+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int findTargetSumWays(int[] nums, int target) {
3+
int s = 0;
4+
for (int x : nums) {
5+
s += x;
6+
}
7+
if (s - target < 0 || (s - target) % 2 != 0) {
8+
return 0;
9+
}
10+
target = (s - target) / 2 + 1;
11+
int[] dp = new int[target];
12+
dp[0] = 1;
13+
for (int i = 1; i < nums.length + 1; ++i) {
14+
for (int j = target - 1; j >= nums[i - 1]; --j) {
15+
dp[j] += dp[j - nums[i - 1]];
16+
}
17+
}
18+
return dp[target - 1];
19+
}
20+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def findTargetSumWays(self, nums: List[int], target: int) -> int:
3+
s = sum(nums)
4+
if s - target < 0 or (s - target) % 2 != 0:
5+
return 0
6+
target = (s - target) // 2 + 1
7+
n = len(nums) + 1
8+
dp = [0] * target
9+
dp[0] = 1
10+
for i in range(1, n):
11+
for j in range(target - 1, nums[i - 1] - 1, -1):
12+
dp[j] += dp[j - nums[i - 1]]
13+
return dp[-1]

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /