Skip to content

Commit eff0d82

Browse files
Add files via upload
1 parent 3e19f87 commit eff0d82

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

Target Sum/Target_Sum.cpp

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// 第一种思路,暴力回溯,果然超时了
2+
class Solution
3+
{
4+
public:
5+
int findTargetSumWays(vector<int>& nums, int target)
6+
{
7+
return dfs(nums, target, 0);
8+
}
9+
private:
10+
int dfs(const vector<int>& nums, int target, int start)
11+
{
12+
if (start == nums.size() - 1)
13+
{
14+
int res = 0;
15+
16+
target == nums.back() ? ++res : res;
17+
target == -nums.back() ? ++res : res;
18+
19+
return res;
20+
}
21+
else
22+
return dfs(nums, target - nums[start], start + 1) + dfs(nums, target + nums[start], start + 1);
23+
}
24+
};
25+
26+
// 第二种思路,使用动态规划
27+
// Runtime: 44 ms, faster than 63.27% of C++ online submissions for Target Sum.
28+
// Memory Usage: 21.1 MB, less than 30.77% of C++ online submissions for Target Sum.
29+
30+
class Solution
31+
{
32+
public:
33+
int findTargetSumWays(vector<int>& nums, int S)
34+
{
35+
int sum = 0;
36+
for (auto item : nums)
37+
sum += item;
38+
39+
int maxValue = sum, minValue = -sum;
40+
41+
// 边界条件处理
42+
if (nums.size() == 0 || S < minValue || S > maxValue)
43+
return 0;
44+
45+
vector<vector<int>> dp(nums.size(), vector<int>(maxValue - minValue + 1, 0));
46+
47+
for (int i = 0; i < dp.size(); ++i)
48+
{
49+
for (int j = 0; j < dp[0].size(); ++j)
50+
{
51+
if (i == 0)
52+
{
53+
int temp = 0;
54+
nums.back() == j + minValue ? ++temp : 0;
55+
-nums.back() == j + minValue ? ++temp : 0;
56+
dp[i][j] = temp;
57+
}
58+
else
59+
{
60+
int index = nums.size() - i - 1;
61+
if (j - nums[index] >= 0 && j - nums[index] < dp[0].size())
62+
dp[i][j] += dp[i - 1][j - nums[index]];
63+
if (j + nums[index] >= 0 && j + nums[index] < dp[0].size())
64+
dp[i][j] += dp[i - 1][j + nums[index]];
65+
}
66+
}
67+
}
68+
return dp[dp.size() - 1][S - minValue];
69+
}
70+
};

0 commit comments

Comments
 (0)