算法记录
LeetCode 题目:
给你一个由 不同 整数组成的数组 nums
,和一个目标整数 target
。请你从 nums
中找出并返回总和为 target
的元素组合的个数。
说明
一、题目
输入: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)
请注意,顺序不同的序列被视作不同的组合。
二、分析
- 就是一个很简单的组合问题,但是因为序列的顺序不重要,因此在过程中我们就不要注意相同数据的计算情况了。
- 目标值的数据很大,如果直接进行递归很有可能就会超时了,因此需要在过程中进行一个状态的保存。
- 因为在递归过程中来来回回的使用已经使用过的情况来进行组合,由此可证名状态保留是很有必要的。
class Solution {
Map<Integer, Integer> map = new HashMap();
public int combinationSum4(int[] nums, int target) {
int ret = dfs(nums, target, 0);
return ret;
}
private int dfs(int[] nums, int target, int start) {
if(target < 0) return 0;
if(target == 0) return 1;
int ret = 0;
if(map.containsKey(target)) return map.get(target);
for(int i = 0; i < nums.length; i++) {
ret += dfs(nums, target - nums[i], i);
}
map.put(target, ret);
return ret;
}
private int number(int num) {
return 1;
}
}
总结
状态记录的递归计算。