From e08d1c5c2cb0f61cb01e6d7e74c1a573f0821c5d Mon Sep 17 00:00:00 2001 From: yanglbme Date: Sat, 24 Jul 2021 17:04:28 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.0377. Combination Sum IV --- README.md | 1 + README_EN.md | 1 + .../0377.Combination Sum IV/README.md | 48 +++++++++++++++--- .../0377.Combination Sum IV/README_EN.md | 50 ++++++++++++++++--- .../0377.Combination Sum IV/Solution.cpp | 15 ++++++ .../0377.Combination Sum IV/Solution.go | 12 +++++ .../0377.Combination Sum IV/Solution.java | 6 +-- .../0377.Combination Sum IV/Solution.py | 6 +-- 8 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 solution/0300-0399/0377.Combination Sum IV/Solution.cpp create mode 100644 solution/0300-0399/0377.Combination Sum IV/Solution.go diff --git a/README.md b/README.md index e997a00b8823f..c9b91c857a1d7 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/README_EN.md b/README_EN.md index 1995965ac3d9e..aed525d5f7447 100644 --- a/README_EN.md +++ b/README_EN.md @@ -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 diff --git a/solution/0300-0399/0377.Combination Sum IV/README.md b/solution/0300-0399/0377.Combination Sum IV/README.md index 6671c278bc8bd..212434c72554f 100644 --- a/solution/0300-0399/0377.Combination Sum IV/README.md +++ b/solution/0300-0399/0377.Combination Sum IV/README.md @@ -51,7 +51,6 @@

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

- ## 解法 @@ -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** @@ -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& nums, int target) { + vector 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] } ``` diff --git a/solution/0300-0399/0377.Combination Sum IV/README_EN.md b/solution/0300-0399/0377.Combination Sum IV/README_EN.md index ff0c0d94c7eac..624ab0f94a19e 100644 --- a/solution/0300-0399/0377.Combination Sum IV/README_EN.md +++ b/solution/0300-0399/0377.Combination Sum IV/README_EN.md @@ -46,9 +46,10 @@ Note that different sequences are counted as different combinations.

 

Follow up: 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?

- ## Solutions +Dynamic programming. + `dp[i]` represents the number of element combinations whose sum is `i`. @@ -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** @@ -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]; } } @@ -86,6 +87,43 @@ class Solution { } ``` +### **C++** + +```cpp +class Solution { +public: + int combinationSum4(vector& nums, int target) { + vector 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] +} +``` + ### **...** ``` diff --git a/solution/0300-0399/0377.Combination Sum IV/Solution.cpp b/solution/0300-0399/0377.Combination Sum IV/Solution.cpp new file mode 100644 index 0000000000000..b1de36a7a88de --- /dev/null +++ b/solution/0300-0399/0377.Combination Sum IV/Solution.cpp @@ -0,0 +1,15 @@ +class Solution { +public: + int combinationSum4(vector& nums, int target) { + vector 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]; + } +}; \ No newline at end of file diff --git a/solution/0300-0399/0377.Combination Sum IV/Solution.go b/solution/0300-0399/0377.Combination Sum IV/Solution.go new file mode 100644 index 0000000000000..7120a57acb580 --- /dev/null +++ b/solution/0300-0399/0377.Combination Sum IV/Solution.go @@ -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] +} \ No newline at end of file diff --git a/solution/0300-0399/0377.Combination Sum IV/Solution.java b/solution/0300-0399/0377.Combination Sum IV/Solution.java index 0d7023486a2e1..f4866a74dd627 100644 --- a/solution/0300-0399/0377.Combination Sum IV/Solution.java +++ b/solution/0300-0399/0377.Combination Sum IV/Solution.java @@ -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]; } -} +} \ No newline at end of file diff --git a/solution/0300-0399/0377.Combination Sum IV/Solution.py b/solution/0300-0399/0377.Combination Sum IV/Solution.py index 48aba8d945d91..1ad3d9a55e1a5 100644 --- a/solution/0300-0399/0377.Combination Sum IV/Solution.py +++ b/solution/0300-0399/0377.Combination Sum IV/Solution.py @@ -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]