377. Combination Sum IV [JavaScript]

一、解题思路

  对于这类题目,大家最容易想到的就是通过DFS枚举所有的可能性,从而得到结果:

const combinationSum4 = (nums, target) => {
  let ans = 0
  dfs(nums, 0)

  return ans

  function dfs (nums, sum) {
    if (sum === target) {
      ans++
      return
    }
    if (sum > target) {
      return
    }

    for (let i = 0; i < nums.length; i++) {
      dfs(nums, sum + nums[i])
    }
  }
}

  但是对于这道题目来说,它的时间复杂度非常的大,至少为:

  n 表示数组的长度
  target 为目标值
  min 为数组中最少的元素
  O(n ^ (target / min))

  所以采用DFS的方式,必然不会通过测试用例。

  对于这种只统计数量,不要求具体方案的问题,通常都可以采用动态规划的方式解决。

  定义状态:

  dp[i]表示构成值为i的组合的个数。

  当i = 0时,dp[0] = 1,这是定义状态的边界情况。

  状态转移方程:

  nums[j] <= i 并且 j ∈ [0, max)
  dp[i] += dp[i - nums[j]]

二、代码实现

const combinationSum4 = (nums, target) => {
  const max = nums.length

  const dp = new Array(target + 1).fill(0)

  dp[0] = 1

  for (let i = 1; i <= target; i++) {
    for (let j = 0; j < max; j++) {
      if (nums[j] <= i) {
        dp[i] += dp[i - nums[j]]
      }
    }
  }
  return dp[target]
}

  如果本文对您有帮助,欢迎关注微信公众号,为您推送更多大前端相关的内容, 欢迎留言讨论,ε=ε=ε=┏(゜ロ゜;)┛。

  您还可以在这些地方找到我:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值