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