栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Leetcode--Java--377. 组合总和 Ⅳ

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode--Java--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

思路

动态规划
状态表示和状态计算如下: 时间复杂度为0(target n),target为状态数量,每个状态要划分为n个子集。

  1. 考虑最后一个位置j的不同的取法,对应不同的划分方案。求每个划分子集的元素数量相加就是对应f[i]的划分方案数量。
  2. 转移的条件要注意状态值i一定要大于划分出的数num[j]。
  3. 初始如果0的话只有一种拆分方案,就是空集。
  4. **进阶:**如果包含负数的话,状态之间转移会存在环,就不能用dp,因为状态之间会有依赖关系,方案数可能有无穷多种,如下1和-1凑2的话,可能为1 - 1, 1 - 1 + 1 - 1… (没法做了
代码
class Solution {
    public int combinationSum4(int[] nums, int target) {
         int f[] = new int[target + 1];
         f[0] = 1;
         for (int i = 0; i <= target; i ++ ) {
             for (int j = 0; j < nums.length; j ++ ) {
                 if (i >= nums[j]) {
                     f[i] = f[i] + f[i - nums[j]];
                 }
             }
         }
         return f[target];
    } 
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/671320.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号