2024.4.22每日一题

LeetCode

组合总和 IV

题目链接:377. 组合总和 Ⅳ - 力扣(LeetCode)

题目描述

给你一个由 不同 整数组成的数组 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

**进阶:**如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?

思路

代码

C++
C++ 复制代码
class Solution {
    int dfs(int i,vector<int> &nums, vector<int> &memo){
        if(i == 0){
            return 1;
        }
        int &res = memo[i];
        if(res != -1){
            return res;
        }
        res = 0;
        for(int x : nums){
            if(x <= i){
                res += dfs(i - x,nums, memo);
            }
        }
        return res;
    }
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<int> memo(target + 1, -1);
        return dfs(target, nums, memo);
    }
};
Java
java 复制代码
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] memo = new int[target + 1];
        Arrays.fill(memo, -1); // -1 表示没有计算过
        return dfs(target, nums, memo);
    }

    private int dfs(int i, int[] nums, int[] memo) {
        if (i == 0) { // 爬完了
            return 1;
        }
        if (memo[i] != -1) { // 之前计算过
            return memo[i];
        }
        int res = 0;
        for (int x : nums) { // 枚举所有可以爬的台阶数
            if (x <= i) {
                res += dfs(i - x, nums, memo);
            }
        }
        return memo[i] = res; // 记忆化
    }
}
相关推荐
柠石榴3 分钟前
【练习】【二分】力扣热题100 34. 在排序数组中查找元素的第一个和最后一个位置
c++·算法·leetcode·二分
梅茜Mercy12 分钟前
数据结构:栈和队列详解(下)
数据结构
Tisfy20 分钟前
LeetCode 2209.用地毯覆盖后的最少白色砖块:记忆化搜索之——深度优先搜索(DFS)
算法·leetcode·深度优先·dfs·题解·记忆化搜索·深度优先搜索
Trouvaille ~29 分钟前
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
数据结构·c++·算法·蓝桥杯·计算机科学·平衡二叉树·avl
陈浩源同学1 小时前
学习 TypeScript 栈和队列数据结构
前端·算法
夏末秋也凉2 小时前
力扣-回溯-491 非递减子序列
数据结构·算法·leetcode
penguin_bark2 小时前
三、动规_子数组系列
算法·leetcode
kyle~2 小时前
thread---基本使用和常见错误
开发语言·c++·算法
曲奇是块小饼干_2 小时前
leetcode刷题记录(一百零八)——322. 零钱兑换
java·算法·leetcode·职场和发展
小wanga3 小时前
【leetcode】滑动窗口
算法·leetcode·职场和发展