例题
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
示例1
输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。
示例2
输入:nums = [9], target = 3
输出:0
提示
- 1 <= nums.length <= 200
- 1 <= nums[i] <= 1000
- nums 中的所有元素 互不相同
- 1 <= target <= 1000
解决
分解法(动态规划)
原理
每个组合的第一个数字是nums中的其中一个,并且剩下数字之和是target
-第一个数字。
如:
nums = [1,2,3], target = 4
理解思路1
- 设定第一个数字是
1
,则剩下数字之和为3,由于第一个1
在前提下已经确定,故这次可能的组合次数相当于nums = [1,2,3], target = 3
的组合次数。 - 同时,在
nums = [1,2,3], target = 3
中会遇到同样的情况,即nums = [1,2,3], target = 3
nums = [1,2,3], target = 2
nums = [1,2,3], target = 1
- 下一个
target
的值是上一个target
减去前提的值
理解思路2
- nums = [1,2,3]
- {target = 3} = {1, …{target = 2}} + {2, …{target = 1}} + {3}
代码
class Solution {
fun combinationSum4(nums: IntArray, target: Int): Int {
val maxList = IntArray(target + 1) { 0 }
for (i in 1..target) {
for (num in nums) {
if (num == i) {
maxList[i]++
} else if (num < i) {
maxList[i] += maxList[i - num]
}
}
}
return maxList[target]
}
}