[路飞]_程序员必刷力扣题: 494. 目标和

「这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战

494. 目标和

给你一个整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。 返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

示例 1:

输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3
复制代码

示例 2:

输入: nums = [1], target = 1
输出: 1
复制代码

提示:

  • 1 <= nums.length <= 20
  • 0 <= nums[i] <= 1000
  • 0 <= sum(nums[i]) <= 1000
  • -1000 <= target <= 1000

暴力破解

思路 有题目可知,给定我们一个数组nums,其中有n个元素,每个元素的值可以为正或者负两种,求最后能够让最终值等于目标值target的结果总数

这里我们用暴力破解的方式,求出每个值为正和为负的所有结果,如果等于target那么总数量res加一

具体实现:

考虑到要求每个值的两种情况这里我们使用递归的方式,递归函数computed需要传入三个参数curr当前值,nums剩余元素,target目标值

  • 声明res=0用来记录所有可能的结果数量
  • 声明computed递归函数,接受三个参数curr,nums,target
    • 递归结束条件为nums的length为0,则结束,如果此时curr===target那么res++
    • 解构numns从新赋值nums,因为递归要传入nums,如果传入同一个nums对象会导致数据错乱,因此需要解构克隆数据
    • pop一个元素item,作为当前处理的函数,并且计算curr加上或者减去item得到的curr1和curr2,继续递归处理
  • 最后返回res即可
var findTargetSumWays = function (nums, target) {
    var res = 0
    function computed(curr, nums, target) {
        if (nums.length === 0) {
            if (curr === target) {
                res++
            }

            return
        }
        // 解构克隆数据
        nums = [...nums]
        var item = nums.pop()
        var curr1 = curr + item
        var curr2 = curr - item
        computed(curr1, nums, target)
        computed(curr2, nums, target)
    }
    computed(0, nums, target)
    return res
};
复制代码

谢谢大家,一起加油

猜你喜欢

转载自juejin.im/post/7067934866821611556