首页 > 其他分享 >LeetCode题练习与总结:组合总和 Ⅳ --377

LeetCode题练习与总结:组合总和 Ⅳ --377

时间:2024-11-06 23:18:16浏览次数:3  
标签:target 组合 nums -- int num 377 LeetCode dp

一、题目描述

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

二、解题思路

这是一个完全背包问题,其中物品(数组 nums 中的元素)可以重复使用,背包容量为 target,我们需要求的是装满背包的方法数。

我们可以使用动态规划来解决这个问题。定义 dp[i] 表示总和为 i 的元素组合的个数。初始化 dp[0] = 1,因为总和为0的元素组合只有一个,就是什么元素都不使用。

对于 nums 中的每个元素 num,我们需要更新 dp 数组,使得每个 dp[i] 包含使用 num 的所有可能组合。

具体来说,对于每个 i 从 num 到 target,我们可以更新 dp[i] 为 dp[i] + dp[i - num]。这是因为对于每个 i,我们可以选择不使用当前的 num(这样组合数不变,即 dp[i]),或者使用当前的 num(这样组合数增加 dp[i - num])。

最后,dp[target] 就是我们要找的答案。

三、具体代码

class Solution {
    public int combinationSum4(int[] nums, int target) {
        // dp[i] 表示总和为 i 的元素组合的个数
        int[] dp = new int[target + 1];
        // 总和为 0 的组合只有一个,就是什么都不选
        dp[0] = 1;
        
        // 对于每个可能的组合总和
        for (int i = 1; i <= target; i++) {
            // 遍历每个数字,尝试更新 dp[i]
            for (int num : nums) {
                if (i >= num) {
                    dp[i] += dp[i - num];
                }
            }
        }
        
        // 返回总和为 target 的组合数
        return dp[target];
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 我们有一个双重循环,外层循环遍历的是从 1 到 target 的所有可能的总和值,这个循环的次数是 target
  • 内层循环遍历的是数组 nums 中的所有元素,这个循环的次数是 nums.length
  • 因此,总的时间复杂度是外层循环次数乘以内层循环次数,即 O(target * nums.length)
2. 空间复杂度
  • 我们使用了一个数组 dp 来存储从 0 到 target 的所有可能的总和值的组合数。
  • 数组 dp 的大小是 target + 1,所以空间复杂度是 O(target)

五、总结知识点

  • 动态规划 (Dynamic Programming, DP):

    • 动态规划是一种用于解决优化问题的算法思想,通过将问题分解为更小的子问题,并将这些子问题的解存储起来以避免重复计算。
  • 数组的使用:

    • 数组 dp 用于存储中间结果,即对于每个可能的组合总和,它的组合数是多少。
  • 初始化:

    • dp[0] = 1; 表示总和为 0 的组合数是 1,即不选择任何元素。
  • 嵌套循环:

    • 外层循环遍历所有可能的组合总和(从 1 到 target)。
    • 内层循环遍历数组 nums 中的每个元素,用于更新 dp 数组。
  • 条件判断:

    • if (i >= num) 确保在尝试更新 dp[i] 时,i 至少要大于或等于 num,这是为了避免数组越界和无效的组合。
  • 状态转移方程:

    • dp[i] += dp[i - num]; 是状态转移方程,它表示总和为 i 的组合数等于所有可能的前一个状态(即 i - num)的组合数之和。
  • 返回值:

    • 最后返回 dp[target],即总和为 target 的组合数。
  • 数组索引的使用:

    • 在内层循环中,通过索引 i - num 来引用之前计算过的组合数,这是动态规划中的一个关键步骤。
  • 整数数组:

    • int[] dp = new int[target + 1]; 创建了一个整数数组,其大小为 target + 1,以存储从 0 到 target 的所有组合数。
  • 类型转换:

    • 在更新 dp[i] 时,隐含了从 int 到 int 的类型转换,因为 dp[i - num] 也是一个 int 类型的值。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:target,组合,nums,--,int,num,377,LeetCode,dp
From: https://blog.csdn.net/weixin_62860386/article/details/143533479

相关文章

  • HDFS 与 Swift:分布式存储系统的特点与适用场景
    在当今大数据时代,分布式存储系统扮演着至关重要的角色。其中,HDFS(HadoopDistributedFileSystem)和Swift是两种广泛应用的分布式存储系统。它们各自具有独特的特点和适用场景,下面我们就来详细了解一下。一、HDFS的特点和适用场景1.特点高可靠性:HDFS通过数据冗余存储来保证......
  • LeetCode题练习与总结:有序矩阵中第 K 小的元素--378
    一、题目描述给你一个 nxn 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。你必须找到一个内存复杂度优于 O(n^2) 的解决方案。示例1:输入:matrix=[[1,5,9],[10,11......
  • 深入理解 Kafka 的消息持久化机制
    在分布式系统中,消息队列扮演着至关重要的角色。Kafka作为一种高性能、高可靠的分布式消息队列系统,其强大的消息持久化机制是保证数据可靠性的关键。那么,什么是Kafka的消息持久化机制呢?一、Kafka简介Kafka是一个开源的分布式事件流平台,最初由LinkedIn公司开发,后来成为Apac......
  • vuex、vue-router实现原理
    Vuex和VueRouter是Vue.js生态系统中非常重要的两个库,分别用于状态管理和路由管理。它们各自的实现原理如下:Vuex实现原理1.状态管理Vuex是一个专为Vue.js应用程序开发的状态管理模式。它使用集中式的存储管理所有组件的状态,并以一种可预测的方式来确保状态以一种可追......
  • 基于Python的影院电影购票系统
    作者:计算机学姐开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码精品专栏:Java精选实战项目源码、Python精选实战项目源码、大数据精选......
  • shodan的使用方法1(泷羽sec)
    声明学习视频来自B站UP主泷羽sec,如涉及侵泷羽sec权马上删除文章。笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了解学习哪些知识对于我们渗透......
  • JavasScript 的对象事件的处理程序
    1、鼠标事件常用的鼠标事件有MouseDown、MouseUp、MouseMove、MouseOver、MouseOut、Click、Blur及Focus等事件。mousedown:按下鼠标键时触发 mouseup:抬起鼠标键时触发 click:单击鼠标时触发 dblclick:在同一个元素上双击鼠标时触发 mouseenter:鼠标进入一个节点时触发,进......
  • 常见 HTTP 状态码分类和解释及服务端向前端返回响应时的最完整格式
    目前的开发项目,准备明年的国产化,用了十年的自研系统借这个机会全部重写,订立更严格的规范,这里把返回格式及对应状态码记录一下。常见HTTP状态码及解释HTTP状态码用于表示客户端请求的响应状态,它们分为五类:2xx表示成功,3xx表示重定向,4xx表示客户端错误,5xx表示服务......
  • 【力扣打卡系列】单调栈
    坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day20单调栈题目描述解题思路单调栈后进先出记录的数据加在最上面丢掉数据也先从最上面开始单调性记录t[i]之前会先把所有小于等于t[i]的数据丢掉,不可能出现上面大下面小的情况倒着遍历,while遍历,......
  • lanqiaoOJ 1110:小王子单链表 ← 数组模拟实现
     【题目来源】https://www.lanqiao.cn/problems/1110/learning/【题目描述】小王子有一天迷上了排队的游戏,桌子上有标号为1-10的10个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把哪个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排......