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/

posted @ 2020-10-18 19:53  Lucky小黄人^_^  阅读(112)  评论(0编辑  收藏  举报