头脑风暴:组合总和 Ⅳ
题目
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
示例 1:
复制代码
示例 2:
复制代码
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 1000
nums 中的所有元素 互不相同
1 <= target <= 1000
解题思路
第一步,确定 dp 数组以及下标的含义:dp[i]: 凑成目标正整数为 i 的排列个数为 dp[i]
第二步,确定递推公式:dp[i] 可以由 dp[i - nums[j]] 推导出来,求装满背包有几种方法,递推公式一般都是 dp[i] += dp[i - nums[j]];
第三步,dp 数组初始化:因为递推公式 dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为 1,这样递归其他 dp[i]的时候才会有数值基础。
第四步,确定遍历顺序:得到的集合是排列,说明需要考虑元素之间的顺序,于是外层 for 遍历背包,内层 for 循环遍历物品。
代码实现
复制代码
最后
时间复杂度:O(target×n),其中 target 是目标值,n 是数组 nums 的长度。
空间复杂度:O(target)。需要创建长度为 target+1 的数组 dp。
版权声明: 本文为 InfoQ 作者【HelloWorld杰少】的原创文章。
原文链接:【http://xie.infoq.cn/article/f0ea6be109890cf4ca456e598】。文章转载请联系作者。
评论