LeetCode 每日一题 377. 组合总和 Ⅳ
377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 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
进阶:如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?
方法一:动态规划
思路
dp[i]
表示总和为 i
时的组合个数,因为数字都是正数,令 dp[0] = 1
(总和为 0 有一种组合,都不选)。
dp[0]
=1
dp[1]
=数组中 1 的个数 * dp[0]
dp[2]
=数组中 2 的个数 * dp[0]
+数组中 1 的个数 * dp[1]
dp[3]
=数组中 3 的个数 * dp[0]
+数组中 2 的个数 * dp[1]
+数组中 1 的个数 * dp[2]
- ……
- 以此类推,直到求出
dp[target]
。
值得注意的是,上述执行流程是为了方便理解 dp[target]
的推导过程。对于任意 dp[i]
,没有必要求出 1
到 i
的个数再去乘以对应的 dp[i - 1]
到 dp[0]
,只需要遍历 nums
找出小于等于 i
的数(即 i >= num),累加 dp[i] += dp[i - num]
即可。
参考代码
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 num : nums) {if (i >= num) {dp[i] += dp[i - num];}}}return dp[target];
}
执行结果
- 进阶问题:如果存在负数,会导致有无限多的结果,总是可以用 N 个 负数 + M 个正数构建出等于 0 的式子。
LeetCode 每日一题 377. 组合总和 Ⅳ相关推荐
- Leetcode每日一题——377.组合总和Ⅳ。完全背包推导。dp数组
题目链接: 力扣 题目描述: 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素组合的个数. 题目数据保证答案符合 ...
- 【Leetcode】完全背包问题-377. 组合总和 Ⅳ
[Leetcode]完全背包问题-377. 组合总和 Ⅳ 题目 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素 ...
- 模拟卷Leetcode【普通】377. 组合总和 Ⅳ
377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素组合的个数. 题目数据保证答案符合 32 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- Leetcode 每日一题 40 组合2
题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能 ...
- [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]
[问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...
- leetcode.377. 组合总和 Ⅳ---dp问题
377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素组合的个数. 题目数据保证答案符合 32 ...
- Java实现 LeetCode 377 组合总和 Ⅳ
377. 组合总和 Ⅳ 给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数. 示例: nums = [1, 2, 3] target = 4 所有可能的组合为: (1, 1 ...
- [Leetcode] 377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target .请你从 nums 中找出并返回总和为 target 的元素组合的个数. 题目数据保证答案符合 32 位整数范围. 示例 1 ...
最新文章
- 用 Navicat for Oracle 管理 Oracle10g/11g 数据库
- 安装 esl php 模块,ESL系统的Docker化部署
- 小流域水土保持遥感信息系统
- BestCoder25 1001.Harry and Magical Computer(hdu 5154) 解题报告
- 在线应用的 Serverless 实践
- linux shell 变量 管道,linux下shell,变量,管道,重定向等基础知识及技巧
- Chrome控制台用法
- javaTemplates-学习笔记四
- 小写数字转大写_微软太坏了,这个函数居然被隐藏了,用它搞定数值转中文大小写...
- 【CodeForces 1260D --- A Game with Traps】二分
- SQL语法——触发器
- 华为最美小姐姐,被外派墨西哥后...
- 理解.exe文件的结构原理即运行过程
- python英语词汇量测试_python英语单词测试小程序
- 如何快速提升 Flutter App 中的动画性能
- FairMOT训练测试自定义数据集
- 上楼梯问题+不死兔子
- llqrcode.js识别二维码,解析二维码信息
- java heap 参数_java heap space解决方法和JVM参数设置--- JVM参数设置和程序优化篇
- 九月的诗11首 - AI 创作诗文绘画