[路飞]目标和

72 阅读1分钟

记录 1 道算法题

目标和

494. 目标和 - 力扣(LeetCode)


要求:提供一个数组和 target,里面是正整数。然后将里面的每一个数作为正数或者负数,相加总和为 target。输出方案的个数。

比如:nums = [1,1,1,1,1], target = 3,输出:5

  1. 回溯

每一个数都有可能作为正数和负数,即每个数都有两种情况,所以可以做递归处理,让执行栈维护方案。

    function findTargetSumWays(nums, target) {
        let count = 0
        // 定义一个递归的函数
        const walk = (nums, i, sum, target) => {
            if (i > nums.length) return
            // 最后一个的时候,判断方案是否合格
            if (i === nums.length && sum === target) {
                count++
                return
            }
            // 正
            walk(nums, i + 1, sum + nums[i], target)
            // 负
            walk(nums, i + 1, sum - nums[i], target)
        }
        
        walk(nums, 0, 0, target)
        return count
    }
  1. 动态规划