57
57
58
58
** 方法一:动态规划**
59
59
60
- 类似完全背包问题,每个整数可以选择多次。但这里需要考虑整数的顺序,只要出现顺序不同,就视为一种方案。因此可以将 nums 放在内层循环中 。
60
+ 我们定义 $f [ i ] $ 表示总和为 $i$ 的元素组合的个数,初始时 $f [ 0 ] = 1$,其余 $f [ i ] = 0$。最终答案即为 $f [ target ] $ 。
61
61
62
- ` dp[i] ` 表示总和为 ` i ` 的元素组合的个数。
62
+ 对于 $f[ i] $,我们可以枚举数组中的每个元素 $x$,如果 $i \ge x$,则 $f[ i] = f[ i] + f[ i - x] $。
63
+
64
+ 最后返回 $f[ target] $ 即可。
65
+
66
+ 时间复杂度 $O(n \times target)$,空间复杂度 $O(target)$。其中 $n$ 为数组的长度。
63
67
64
68
<!-- tabs:start -->
65
69
70
74
``` python
71
75
class Solution :
72
76
def combinationSum4 (self , nums : List[int ], target : int ) -> int :
73
- dp = [0 ] * (target + 1 )
74
- dp[0 ] = 1
77
+ f = [1 ] + [0 ] * target
75
78
for i in range (1 , target + 1 ):
76
- for num in nums:
77
- if i >= num :
78
- dp [i] += dp [i - num ]
79
- return dp[ - 1 ]
79
+ for x in nums:
80
+ if i >= x :
81
+ f [i] += f [i - x ]
82
+ return f[target ]
80
83
```
81
84
82
85
### ** Java**
@@ -86,16 +89,16 @@ class Solution:
86
89
``` java
87
90
class Solution {
88
91
public int combinationSum4 (int [] nums , int target ) {
89
- int [] dp = new int [target + 1 ];
90
- dp [0 ] = 1 ;
92
+ int [] f = new int [target + 1 ];
93
+ f [0 ] = 1 ;
91
94
for (int i = 1 ; i <= target; ++ i) {
92
- for (int num : nums) {
93
- if (i >= num ) {
94
- dp [i] += dp [i - num ];
95
+ for (int x : nums) {
96
+ if (i >= x ) {
97
+ f [i] += f [i - x ];
95
98
}
96
99
}
97
100
}
98
- return dp [target];
101
+ return f [target];
99
102
}
100
103
}
101
104
```
@@ -106,16 +109,17 @@ class Solution {
106
109
class Solution {
107
110
public:
108
111
int combinationSum4(vector<int >& nums, int target) {
109
- vector<int > dp(target + 1);
110
- dp[ 0] = 1;
112
+ int f[ target + 1] ;
113
+ memset(f, 0, sizeof(f));
114
+ f[ 0] = 1;
111
115
for (int i = 1; i <= target; ++i) {
112
- for (int num : nums) {
113
- if (i >= num && dp [ i - num ] < INT_MAX - dp [ i] ) {
114
- dp [ i] += dp [ i - num ] ;
116
+ for (int x : nums) {
117
+ if (i >= x && f [ i - x ] < INT_MAX - f [ i] ) {
118
+ f [ i] += f [ i - x ] ;
115
119
}
116
120
}
117
121
}
118
- return dp [ target] ;
122
+ return f [ target] ;
119
123
}
120
124
};
121
125
```
@@ -124,16 +128,16 @@ public:
124
128
125
129
```go
126
130
func combinationSum4(nums []int, target int) int {
127
- dp := make([]int, target+1)
128
- dp [0] = 1
131
+ f := make([]int, target+1)
132
+ f [0] = 1
129
133
for i := 1; i <= target; i++ {
130
- for _, num := range nums {
131
- if i >= num {
132
- dp [i] += dp [i-num ]
134
+ for _, x := range nums {
135
+ if i >= x {
136
+ f [i] += f [i-x ]
133
137
}
134
138
}
135
139
}
136
- return dp [target]
140
+ return f [target]
137
141
}
138
142
```
139
143
@@ -146,19 +150,55 @@ func combinationSum4(nums []int, target int) int {
146
150
* @return {number}
147
151
*/
148
152
var combinationSum4 = function (nums , target ) {
149
- const dp = new Array (target + 1 ).fill (0 );
150
- dp [0 ] = 1 ;
153
+ const f = new Array (target + 1 ).fill (0 );
154
+ f [0 ] = 1 ;
151
155
for (let i = 1 ; i <= target; ++ i) {
152
- for (let v of nums) {
153
- if (i >= v ) {
154
- dp [i] += dp [i - v ];
156
+ for (const x of nums) {
157
+ if (i >= x ) {
158
+ f [i] += f [i - x ];
155
159
}
156
160
}
157
161
}
158
- return dp [target];
162
+ return f [target];
159
163
};
160
164
```
161
165
166
+ ### ** TypeScript**
167
+
168
+ ``` ts
169
+ function combinationSum4(nums : number [], target : number ): number {
170
+ const f: number [] = new Array (target + 1 ).fill (0 );
171
+ f [0 ] = 1 ;
172
+ for (let i = 1 ; i <= target ; ++ i ) {
173
+ for (const x of nums ) {
174
+ if (i >= x ) {
175
+ f [i ] += f [i - x ];
176
+ }
177
+ }
178
+ }
179
+ return f [target ];
180
+ }
181
+ ```
182
+
183
+ ### ** C#**
184
+
185
+ ``` cs
186
+ public class Solution {
187
+ public int CombinationSum4 (int [] nums , int target ) {
188
+ int [] f = new int [target + 1 ];
189
+ f [0 ] = 1 ;
190
+ for (int i = 1 ; i <= target ; ++ i ) {
191
+ foreach (int x in nums ) {
192
+ if (i >= x ) {
193
+ f [i ] += f [i - x ];
194
+ }
195
+ }
196
+ }
197
+ return f [target ];
198
+ }
199
+ }
200
+ ```
201
+
162
202
### ** ...**
163
203
164
204
```
0 commit comments