Skip to content

Commit 32e503a

Browse files
committed
feat: add solutions to lc problem: No.0377
No.0377.Combination Sum IV
1 parent 90be8cb commit 32e503a

File tree

9 files changed

+194
-92
lines changed

9 files changed

+194
-92
lines changed

solution/0300-0399/0377.Combination Sum IV/README.md

+72-32
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,13 @@
5757

5858
**方法一:动态规划**
5959

60-
类似完全背包问题,每个整数可以选择多次。但这里需要考虑整数的顺序,只要出现顺序不同,就视为一种方案。因此可以将 nums 放在内层循环中
60+
我们定义 $f[i]$ 表示总和为 $i$ 的元素组合的个数,初始时 $f[0] = 1$,其余 $f[i] = 0$。最终答案即为 $f[target]$
6161

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$ 为数组的长度。
6367

6468
<!-- tabs:start -->
6569

@@ -70,13 +74,12 @@
7074
```python
7175
class Solution:
7276
def combinationSum4(self, nums: List[int], target: int) -> int:
73-
dp = [0] * (target + 1)
74-
dp[0] = 1
77+
f = [1] + [0] * target
7578
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]
8083
```
8184

8285
### **Java**
@@ -86,16 +89,16 @@ class Solution:
8689
```java
8790
class Solution {
8891
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;
9194
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];
9598
}
9699
}
97100
}
98-
return dp[target];
101+
return f[target];
99102
}
100103
}
101104
```
@@ -106,16 +109,17 @@ class Solution {
106109
class Solution {
107110
public:
108111
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;
111115
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];
115119
}
116120
}
117121
}
118-
return dp[target];
122+
return f[target];
119123
}
120124
};
121125
```
@@ -124,16 +128,16 @@ public:
124128
125129
```go
126130
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
129133
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]
133137
}
134138
}
135139
}
136-
return dp[target]
140+
return f[target]
137141
}
138142
```
139143

@@ -146,19 +150,55 @@ func combinationSum4(nums []int, target int) int {
146150
* @return {number}
147151
*/
148152
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;
151155
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];
155159
}
156160
}
157161
}
158-
return dp[target];
162+
return f[target];
159163
};
160164
```
161165

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+
162202
### **...**
163203

164204
```

solution/0300-0399/0377.Combination Sum IV/README_EN.md

+66-30
Original file line numberDiff line numberDiff line change
@@ -59,30 +59,29 @@ Dynamic programming.
5959
```python
6060
class Solution:
6161
def combinationSum4(self, nums: List[int], target: int) -> int:
62-
dp = [0] * (target + 1)
63-
dp[0] = 1
62+
f = [1] + [0] * target
6463
for i in range(1, target + 1):
65-
for num in nums:
66-
if i >= num:
67-
dp[i] += dp[i - num]
68-
return dp[-1]
64+
for x in nums:
65+
if i >= x:
66+
f[i] += f[i - x]
67+
return f[target]
6968
```
7069

7170
### **Java**
7271

7372
```java
7473
class Solution {
7574
public int combinationSum4(int[] nums, int target) {
76-
int[] dp = new int[target + 1];
77-
dp[0] = 1;
75+
int[] f = new int[target + 1];
76+
f[0] = 1;
7877
for (int i = 1; i <= target; ++i) {
79-
for (int num : nums) {
80-
if (i >= num) {
81-
dp[i] += dp[i - num];
78+
for (int x : nums) {
79+
if (i >= x) {
80+
f[i] += f[i - x];
8281
}
8382
}
8483
}
85-
return dp[target];
84+
return f[target];
8685
}
8786
}
8887
```
@@ -93,16 +92,17 @@ class Solution {
9392
class Solution {
9493
public:
9594
int combinationSum4(vector<int>& nums, int target) {
96-
vector<int> dp(target + 1);
97-
dp[0] = 1;
95+
int f[target + 1];
96+
memset(f, 0, sizeof(f));
97+
f[0] = 1;
9898
for (int i = 1; i <= target; ++i) {
99-
for (int num : nums) {
100-
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
101-
dp[i] += dp[i - num];
99+
for (int x : nums) {
100+
if (i >= x && f[i - x] < INT_MAX - f[i]) {
101+
f[i] += f[i - x];
102102
}
103103
}
104104
}
105-
return dp[target];
105+
return f[target];
106106
}
107107
};
108108
```
@@ -111,16 +111,16 @@ public:
111111
112112
```go
113113
func combinationSum4(nums []int, target int) int {
114-
dp := make([]int, target+1)
115-
dp[0] = 1
114+
f := make([]int, target+1)
115+
f[0] = 1
116116
for i := 1; i <= target; i++ {
117-
for _, num := range nums {
118-
if i >= num {
119-
dp[i] += dp[i-num]
117+
for _, x := range nums {
118+
if i >= x {
119+
f[i] += f[i-x]
120120
}
121121
}
122122
}
123-
return dp[target]
123+
return f[target]
124124
}
125125
```
126126

@@ -133,19 +133,55 @@ func combinationSum4(nums []int, target int) int {
133133
* @return {number}
134134
*/
135135
var combinationSum4 = function (nums, target) {
136-
const dp = new Array(target + 1).fill(0);
137-
dp[0] = 1;
136+
const f = new Array(target + 1).fill(0);
137+
f[0] = 1;
138138
for (let i = 1; i <= target; ++i) {
139-
for (let v of nums) {
140-
if (i >= v) {
141-
dp[i] += dp[i - v];
139+
for (const x of nums) {
140+
if (i >= x) {
141+
f[i] += f[i - x];
142142
}
143143
}
144144
}
145-
return dp[target];
145+
return f[target];
146146
};
147147
```
148148

149+
### **TypeScript**
150+
151+
```ts
152+
function combinationSum4(nums: number[], target: number): number {
153+
const f: number[] = new Array(target + 1).fill(0);
154+
f[0] = 1;
155+
for (let i = 1; i <= target; ++i) {
156+
for (const x of nums) {
157+
if (i >= x) {
158+
f[i] += f[i - x];
159+
}
160+
}
161+
}
162+
return f[target];
163+
}
164+
```
165+
166+
### **C#**
167+
168+
```cs
169+
public class Solution {
170+
public int CombinationSum4(int[] nums, int target) {
171+
int[] f = new int[target + 1];
172+
f[0] = 1;
173+
for (int i = 1; i <= target; ++i) {
174+
foreach (int x in nums) {
175+
if (i >= x) {
176+
f[i] += f[i - x];
177+
}
178+
}
179+
}
180+
return f[target];
181+
}
182+
}
183+
```
184+
149185
### **...**
150186

151187
```
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
class Solution {
22
public:
33
int combinationSum4(vector<int>& nums, int target) {
4-
vector<int> dp(target + 1);
5-
dp[0] = 1;
4+
int f[target + 1];
5+
memset(f, 0, sizeof(f));
6+
f[0] = 1;
67
for (int i = 1; i <= target; ++i) {
7-
for (int num : nums) {
8-
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
9-
dp[i] += dp[i - num];
8+
for (int x : nums) {
9+
if (i >= x && f[i - x] < INT_MAX - f[i]) {
10+
f[i] += f[i - x];
1011
}
1112
}
1213
}
13-
return dp[target];
14+
return f[target];
1415
}
1516
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
public class Solution {
2+
public int CombinationSum4(int[] nums, int target) {
3+
int[] f = new int[target + 1];
4+
f[0] = 1;
5+
for (int i = 1; i <= target; ++i) {
6+
foreach (int x in nums) {
7+
if (i >= x) {
8+
f[i] += f[i - x];
9+
}
10+
}
11+
}
12+
return f[target];
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
func combinationSum4(nums []int, target int) int {
2-
dp := make([]int, target+1)
3-
dp[0] = 1
2+
f := make([]int, target+1)
3+
f[0] = 1
44
for i := 1; i <= target; i++ {
5-
for _, num := range nums {
6-
if i >= num {
7-
dp[i] += dp[i-num]
5+
for _, x := range nums {
6+
if i >= x {
7+
f[i] += f[i-x]
88
}
99
}
1010
}
11-
return dp[target]
11+
return f[target]
1212
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
class Solution {
22
public int combinationSum4(int[] nums, int target) {
3-
int[] dp = new int[target + 1];
4-
dp[0] = 1;
3+
int[] f = new int[target + 1];
4+
f[0] = 1;
55
for (int i = 1; i <= target; ++i) {
6-
for (int num : nums) {
7-
if (i >= num) {
8-
dp[i] += dp[i - num];
6+
for (int x : nums) {
7+
if (i >= x) {
8+
f[i] += f[i - x];
99
}
1010
}
1111
}
12-
return dp[target];
12+
return f[target];
1313
}
1414
}

0 commit comments

Comments
 (0)