LeetCode-组合总和 Ⅳ

1,992 阅读1分钟

算法记录

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;
    }
}

总结

状态记录的递归计算。