Skip to content

Commit

Permalink
feat: add solutions to lc problem: No.0377. Combination Sum IV
Browse files Browse the repository at this point in the history
  • Loading branch information
yanglbme committed Jul 24, 2021
1 parent 47333f4 commit e08d1c5
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 18 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@
- [编辑距离](./solution/0000-0099/0072.Edit%20Distance/README.md)
- [零钱兑换](./solution/0300-0399/0322.Coin%20Change/README.md)
- [零钱兑换 II](./solution/0500-0599/0518.Coin%20Change%202/README.md)
- [组合总和 Ⅳ](./solution/0300-0399/0377.Combination%20Sum%20IV/README.md)
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
- [俄罗斯套娃信封问题](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md)

Expand Down
1 change: 1 addition & 0 deletions README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
- [Edit Distance](./solution/0000-0099/0072.Edit%20Distance/README_EN.md)
- [Coin Change](./solution/0300-0399/0322.Coin%20Change/README_EN.md)
- [Coin Change 2](./solution/0500-0599/0518.Coin%20Change%202/README_EN.md)
- [Combination Sum IV](./solution/0300-0399/0377.Combination%20Sum%20IV/README_EN.md)
- [Russian Doll Envelopes](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md)

### Backtracking
Expand Down
48 changes: 42 additions & 6 deletions solution/0300-0399/0377.Combination Sum IV/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@

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


## 解法

<!-- 这里可写通用的实现逻辑 -->
Expand All @@ -67,13 +66,13 @@
```python
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0 for i in range(target + 1)]
dp = [0] * (target + 1)
dp[0] = 1
for i in range(1, target + 1):
for num in nums:
if i - num >= 0:
if i >= num:
dp[i] += dp[i - num]
return dp[target]
return dp[-1]
```

### **Java**
Expand All @@ -85,15 +84,52 @@ class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int i = 1; i <= target; ++i) {
for (int num : nums) {
if (i >= num) {
dp[i] += dp[i - num];
}
}
}
return dp[target];
}
}
```

### **C++**

```cpp
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target + 1);
dp[0] = 1;
for (int i = 1; i <= target; ++i) {
for (int num : nums) {
if (i - num >= 0) {
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
dp[i] += dp[i - num];
}
}
}
return dp[target];
}
};
```
### **Go**
```go
func combinationSum4(nums []int, target int) int {
dp := make([]int, target+1)
dp[0] = 1
for i := 1; i <= target; i++ {
for _, num := range nums {
if i >= num {
dp[i] += dp[i-num]
}
}
}
return dp[target]
}
```

Expand Down
50 changes: 44 additions & 6 deletions solution/0300-0399/0377.Combination Sum IV/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,10 @@ Note that different sequences are counted as different combinations.
<p>&nbsp;</p>
<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>


## Solutions

Dynamic programming.

`dp[i]` represents the number of element combinations whose sum is `i`.

<!-- tabs:start -->
Expand All @@ -58,13 +59,13 @@ Note that different sequences are counted as different combinations.
```python
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0 for i in range(target + 1)]
dp = [0] * (target + 1)
dp[0] = 1
for i in range(1, target + 1):
for num in nums:
if i - num >= 0:
if i >= num:
dp[i] += dp[i - num]
return dp[target]
return dp[-1]
```

### **Java**
Expand All @@ -74,9 +75,9 @@ class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int i = 1; i <= target; ++i) {
for (int num : nums) {
if (i - num >= 0) {
if (i >= num) {
dp[i] += dp[i - num];
}
}
Expand All @@ -86,6 +87,43 @@ class Solution {
}
```

### **C++**

```cpp
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target + 1);
dp[0] = 1;
for (int i = 1; i <= target; ++i) {
for (int num : nums) {
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
dp[i] += dp[i - num];
}
}
}
return dp[target];
}
};
```
### **Go**
```go
func combinationSum4(nums []int, target int) int {
dp := make([]int, target+1)
dp[0] = 1
for i := 1; i <= target; i++ {
for _, num := range nums {
if i >= num {
dp[i] += dp[i-num]
}
}
}
return dp[target]
}
```

### **...**

```
Expand Down
15 changes: 15 additions & 0 deletions solution/0300-0399/0377.Combination Sum IV/Solution.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target + 1);
dp[0] = 1;
for (int i = 1; i <= target; ++i) {
for (int num : nums) {
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
dp[i] += dp[i - num];
}
}
}
return dp[target];
}
};
12 changes: 12 additions & 0 deletions solution/0300-0399/0377.Combination Sum IV/Solution.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
func combinationSum4(nums []int, target int) int {
dp := make([]int, target+1)
dp[0] = 1
for i := 1; i <= target; i++ {
for _, num := range nums {
if i >= num {
dp[i] += dp[i-num]
}
}
}
return dp[target]
}
6 changes: 3 additions & 3 deletions solution/0300-0399/0377.Combination Sum IV/Solution.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int i = 1; i <= target; ++i) {
for (int num : nums) {
if (i - num >= 0) {
if (i >= num) {
dp[i] += dp[i - num];
}
}
}
return dp[target];
}
}
}
6 changes: 3 additions & 3 deletions solution/0300-0399/0377.Combination Sum IV/Solution.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0 for i in range(target + 1)]
dp = [0] * (target + 1)
dp[0] = 1
for i in range(1, target + 1):
for num in nums:
if i - num >= 0:
if i >= num:
dp[i] += dp[i - num]
return dp[target]
return dp[-1]

0 comments on commit e08d1c5

Please sign in to comment.