Skip to content

Commit e08d1c5

Browse files
committed
feat: add solutions to lc problem: No.0377. Combination Sum IV
1 parent 47333f4 commit e08d1c5

File tree

8 files changed

+121
-18
lines changed

8 files changed

+121
-18
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@
200200
- [编辑距离](./solution/0000-0099/0072.Edit%20Distance/README.md)
201201
- [零钱兑换](./solution/0300-0399/0322.Coin%20Change/README.md)
202202
- [零钱兑换 II](./solution/0500-0599/0518.Coin%20Change%202/README.md)
203+
- [组合总和 Ⅳ](./solution/0300-0399/0377.Combination%20Sum%20IV/README.md)
203204
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
204205
- [俄罗斯套娃信封问题](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md)
205206

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
194194
- [Edit Distance](./solution/0000-0099/0072.Edit%20Distance/README_EN.md)
195195
- [Coin Change](./solution/0300-0399/0322.Coin%20Change/README_EN.md)
196196
- [Coin Change 2](./solution/0500-0599/0518.Coin%20Change%202/README_EN.md)
197+
- [Combination Sum IV](./solution/0300-0399/0377.Combination%20Sum%20IV/README_EN.md)
197198
- [Russian Doll Envelopes](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md)
198199

199200
### Backtracking

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

+42-6
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151

5252
<p><strong>进阶:</strong>如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?</p>
5353

54-
5554
## 解法
5655

5756
<!-- 这里可写通用的实现逻辑 -->
@@ -67,13 +66,13 @@
6766
```python
6867
class Solution:
6968
def combinationSum4(self, nums: List[int], target: int) -> int:
70-
dp = [0 for i in range(target + 1)]
69+
dp = [0] * (target + 1)
7170
dp[0] = 1
7271
for i in range(1, target + 1):
7372
for num in nums:
74-
if i - num >= 0:
73+
if i >= num:
7574
dp[i] += dp[i - num]
76-
return dp[target]
75+
return dp[-1]
7776
```
7877

7978
### **Java**
@@ -85,15 +84,52 @@ class Solution {
8584
public int combinationSum4(int[] nums, int target) {
8685
int[] dp = new int[target + 1];
8786
dp[0] = 1;
88-
for (int i = 1; i <= target; i++) {
87+
for (int i = 1; i <= target; ++i) {
88+
for (int num : nums) {
89+
if (i >= num) {
90+
dp[i] += dp[i - num];
91+
}
92+
}
93+
}
94+
return dp[target];
95+
}
96+
}
97+
```
98+
99+
### **C++**
100+
101+
```cpp
102+
class Solution {
103+
public:
104+
int combinationSum4(vector<int>& nums, int target) {
105+
vector<int> dp(target + 1);
106+
dp[0] = 1;
107+
for (int i = 1; i <= target; ++i) {
89108
for (int num : nums) {
90-
if (i - num >= 0) {
109+
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
91110
dp[i] += dp[i - num];
92111
}
93112
}
94113
}
95114
return dp[target];
96115
}
116+
};
117+
```
118+
119+
### **Go**
120+
121+
```go
122+
func combinationSum4(nums []int, target int) int {
123+
dp := make([]int, target+1)
124+
dp[0] = 1
125+
for i := 1; i <= target; i++ {
126+
for _, num := range nums {
127+
if i >= num {
128+
dp[i] += dp[i-num]
129+
}
130+
}
131+
}
132+
return dp[target]
97133
}
98134
```
99135

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

+44-6
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ Note that different sequences are counted as different combinations.
4646
<p>&nbsp;</p>
4747
<p><strong>Follow up:</strong> What if negative numbers are allowed in the given array? How does it change the problem? What limitation we need to add to the question to allow negative numbers?</p>
4848

49-
5049
## Solutions
5150

51+
Dynamic programming.
52+
5253
`dp[i]` represents the number of element combinations whose sum is `i`.
5354

5455
<!-- tabs:start -->
@@ -58,13 +59,13 @@ Note that different sequences are counted as different combinations.
5859
```python
5960
class Solution:
6061
def combinationSum4(self, nums: List[int], target: int) -> int:
61-
dp = [0 for i in range(target + 1)]
62+
dp = [0] * (target + 1)
6263
dp[0] = 1
6364
for i in range(1, target + 1):
6465
for num in nums:
65-
if i - num >= 0:
66+
if i >= num:
6667
dp[i] += dp[i - num]
67-
return dp[target]
68+
return dp[-1]
6869
```
6970

7071
### **Java**
@@ -74,9 +75,9 @@ class Solution {
7475
public int combinationSum4(int[] nums, int target) {
7576
int[] dp = new int[target + 1];
7677
dp[0] = 1;
77-
for (int i = 1; i <= target; i++) {
78+
for (int i = 1; i <= target; ++i) {
7879
for (int num : nums) {
79-
if (i - num >= 0) {
80+
if (i >= num) {
8081
dp[i] += dp[i - num];
8182
}
8283
}
@@ -86,6 +87,43 @@ class Solution {
8687
}
8788
```
8889

90+
### **C++**
91+
92+
```cpp
93+
class Solution {
94+
public:
95+
int combinationSum4(vector<int>& nums, int target) {
96+
vector<int> dp(target + 1);
97+
dp[0] = 1;
98+
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];
102+
}
103+
}
104+
}
105+
return dp[target];
106+
}
107+
};
108+
```
109+
110+
### **Go**
111+
112+
```go
113+
func combinationSum4(nums []int, target int) int {
114+
dp := make([]int, target+1)
115+
dp[0] = 1
116+
for i := 1; i <= target; i++ {
117+
for _, num := range nums {
118+
if i >= num {
119+
dp[i] += dp[i-num]
120+
}
121+
}
122+
}
123+
return dp[target]
124+
}
125+
```
126+
89127
### **...**
90128

91129
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int combinationSum4(vector<int>& nums, int target) {
4+
vector<int> dp(target + 1);
5+
dp[0] = 1;
6+
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];
10+
}
11+
}
12+
}
13+
return dp[target];
14+
}
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func combinationSum4(nums []int, target int) int {
2+
dp := make([]int, target+1)
3+
dp[0] = 1
4+
for i := 1; i <= target; i++ {
5+
for _, num := range nums {
6+
if i >= num {
7+
dp[i] += dp[i-num]
8+
}
9+
}
10+
}
11+
return dp[target]
12+
}

solution/0300-0399/0377.Combination Sum IV/Solution.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ class Solution {
22
public int combinationSum4(int[] nums, int target) {
33
int[] dp = new int[target + 1];
44
dp[0] = 1;
5-
for (int i = 1; i <= target; i++) {
5+
for (int i = 1; i <= target; ++i) {
66
for (int num : nums) {
7-
if (i - num >= 0) {
7+
if (i >= num) {
88
dp[i] += dp[i - num];
99
}
1010
}
1111
}
1212
return dp[target];
1313
}
14-
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class Solution:
22
def combinationSum4(self, nums: List[int], target: int) -> int:
3-
dp = [0 for i in range(target + 1)]
3+
dp = [0] * (target + 1)
44
dp[0] = 1
55
for i in range(1, target + 1):
66
for num in nums:
7-
if i - num >= 0:
7+
if i >= num:
88
dp[i] += dp[i - num]
9-
return dp[target]
9+
return dp[-1]

0 commit comments

Comments
 (0)