377. 组合总和 Ⅳ

embedded/2024/10/18 8:20:26/

leetcode.cn/problems/combination-sum-iv/" rel="nofollow">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[target]表示爬target楼梯的方案数。

考虑最后一次怕了num = nums[j](需要满足num<i,防止下标越界),此时方案数为dp[i-num],这里的num,nums数组中的各个元素都有可能。所以递推方程,j需要满足num[j]<i
dp ( i , j ) = ∑ j = 0 n − 1 dp ( i − nums [ j ] ) \text{dp}(i,j) = \sum_{j=0}^{n-1} \text{dp}(i - \text{nums}[j]) dp(i,j)=j=0n1dp(inums[j])
边界条件:dp[0]=1,爬 0 个台阶的方案数是 1。

class Solution {public int combinationSum4(int[] nums, int target) {// dp数组,dp[i]表示和为i的方案数int[] dp = new int[target + 1];dp[0] = 1;  // 边界条件,和为0的方案数为1for (int i = 1; i <= target; i++) {for (Integer num : nums) {if (num <= i) {// 递推方程dp[i] += dp[i - num];}}}return dp[target];}
}

踩坑点

最开始是用回溯去求解,部分用例超时:

private int res = 0; // 记录组合数量public int combinationSum4Temp(int[] nums, int target) {Arrays.sort(nums);backtracking(nums, target, 0);return res;
}/*** 回溯函数* 每层都会遍历数组,需要剪枝** @param nums       给定数组* @param target     目标和* @param currentSum 当前元素和*/
private void backtracking(int[] nums, int target, int currentSum) {if (currentSum == target) {res++;  // 组合数+1return;}// 剪枝:nums[i] + currentSum <= target,提前过滤掉不符合的组合for (int i = 0; i < nums.length && nums[i] + currentSum <= target; i++) {currentSum += nums[i];backtracking(nums, target, currentSum);  // 递归currentSum -= nums[i];  // 回溯}
}

http://www.ppmy.cn/embedded/19966.html

相关文章

K8s: Ingress对象, 创建Ingress控制器, 创建Ingress资源并暴露服务

Ingress对象 1 &#xff09;概述 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTPIngress-nginx 本质是网关&#xff0c;当你请求 abc.com/service/a, Ingress 就把对应的地址转发给你&#xff0c;底层运行了一个 nginx但 K8s 为什么不…

Golang | Leetcode Golang题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; func totalNQueens(n int) (ans int) {columns : make([]bool, n) // 列上是否有皇后diagonals1 : make([]bool, 2*n-1) // 左上到右下是否有皇后diagonals2 : make([]bool, 2*n-1) // 右上到左下是否有皇后var backtrack func(int)…

SpringBoot学习之Redis下载安装启动【Windows版本】(三十六)

一、下载Redis for Windows Redis 官方网站没有提供 Windows 版的安装包,但可以通过 GitHub 来下载安装包,下载地址:https://github.com/tporadowski/redis/releases 1、网站提供了安装包和免安装版本,这里我们直接选择下面的免安装版本 2、下载后的压缩包解压以后,如下…

Linux server

查看服务器版本&#xff1a; rootpsh-ats-02:/# cat /etc/issue Ubuntu 16.04.3 LTS \n \l rootpsh-ats-02:/# chromedriver --version ChromeDriver 103.0.5060.53 (a1711811edd74ff1cf2150f36ffa3b0dae40b17f-refs/branch-heads/5060{#853}) rootpsh-ats-02:/# google-chrome…

HBase的简单学习三

一 过滤器 1.1相关概念 1.过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤&#xff0c; 基于 HBase 本身提供的三维有序&#xff08;行键&#xff0c;列&#xff0c;版本有序&#xff09;&#xff0c;这些过滤器可以高效地完成查询过滤的任务&#xff0c;带有过滤…

Java微服务架构之Spring Boot —上篇

SpringBoot 概述 SpringBoot提供了一种快速使用Spring的方式&#xff0c;基于约定优于配置的思想&#xff0c;可以让开发人员不必在配置与逻辑业务之间进行思维的切换&#xff0c;全身心的投入到逻辑业务的代码编写中&#xff0c;从而大大提高了开发的效率&#xff0c;一定程度…

【研发管理】产品经理知识体系-产品创新中的市场调研

导读&#xff1a;在产品创新过程中&#xff0c;市场调研的重要性不言而喻。它不仅是产品创新的起点&#xff0c;也是确保产品成功推向市场的关键步骤。对于产品经理系统学习和掌握产品创新中的市场调研相关知识体系十分重要。 目录 概述&#xff1a;市场调研重要性 1、相关概…

AIGC学习步骤

目录 AIGC学习步骤 步骤一&#xff1a;理解基本概念 步骤二&#xff1a;学习资源 步骤三&#xff1a;深入研究 步骤四&#xff1a;联系专家 步骤五&#xff1a;实践应用 步骤六&#xff1a;持续学习 AIGC学习步骤 我们先来说说什么是AIGC&#xff1f; 生成式人工智能—…