• 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/

  • 相关阅读:
    【Express系列】第3篇——接入mysql
    【Express系列】第2篇——主程序的改造
    【Express系列】第1篇——项目创建
    AngularJS内置指令
    node服务端搭建学习笔记
    生成ssh key
    webstorm的常用操作
    VSCode 常用插件
    php集成包
    composer安装特别慢的解决方案
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/13836782.html
Copyright © 2020-2023  润新知