leetcode hot 100- 494. 目标和
494. 目标和
题目描述
给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
示例:
输入:nums: [1, 1, 1, 1, 1], S: 3 输出:5 解释: -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 一共有5种方法让最终目标和为3。
提示:
数组非空,且长度不会超过 20 。 初始的数组的和不会超过 1000 。 保证返回的最终结果能被 32 位整数存下
思路一:回溯
每个数可以加上,也可以减去,有两种选择,
当遍历完所有元素后可以判断是否等于S, 如果等于的话计数器加一
1 class Solution { 2 3 public int cnt = 0; // 计数器,统计方法数 4 public int findTargetSumWays(int[] nums, int S) { 5 if(nums == null || nums.length == 0){ 6 return 0; 7 } 8 traceBack(0, 0, S, nums); 9 return cnt; 10 } 11 12 // 回溯 13 public void traceBack(int index, int nowSum, int S, int[] nums){ 14 // 当遍历完所有元素后可以判断是否等于S, 如果等于的话计数器加一 15 if(index >= nums.length){ 16 if(nowSum == S){ 17 cnt++; 18 } 19 return; 20 } 21 // 每个数可以加上,也可以减去,有两种选择 22 traceBack(index+1, nowSum + nums[index], S, nums); 23 traceBack(index+1, nowSum - nums[index], S, nums); 24 } 25 }
leetcode 执行用时:618 ms > 28.48%, 内存消耗:35.7 MB > 99.84%
复杂度分析:
时间复杂度:O(2n), 因为每个元素都有被加上或者被减去, 所以复杂度为O(2n).
空间复杂度:O(n), 空间复杂度取决于栈的深度,栈的深度取决于数组的元素个数,所以空间复杂度为O(n)
思路二:动态规划(还没看懂),以后再回过头来看
01背包问题
思路参考:https://leetcode-cn.com/problems/target-sum/solution/mu-biao-he-by-leetcode/