力扣题解(目标和)

494. 目标和

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

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

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

思路:

可以看成每个元素是加上还是减去,标准的01背包问题。

dp[i][j]表示前i个物品,结果恰好是j的所有可能数目。dp[i][j]的构成是:

dp[i-1][j-num[i]],表示加上第i个元素。

dp[i-1][j+num[i]],表示减去第i个元素。

dp[i][j]+=(dp[i-1][j-num[i]]+dp[i-1][j+num[i]]).

注意:本题是存在前面全部是减去一个数的情况,因此j从逻辑上来说可能是负的,但数组的下标只能从0开始,因此需要将逻辑上的(-sum,+sum)转移到实际数组下标(0,2*sum)。则此时要找target就是j=sum+target。

初始化:

i=0时,仅有和为0有一种可能,则dp[0][sum]=1,j=0时,仅有i=n才有一种情况(即全都取负数)。其余位置全是0.

特殊情况:

target可能存在过大或者过小的情况,因为最后要返回的是dp[n][target+sum],但数组实际j取值范围是(0,2*sum),则若target<-sum或者target>sum,此时数组越界,因此需要单独讨论,但针对这两种情况,一定是取不到的,因此直接返回0就行。

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
      int n=nums.size();
      int k=0;
      for(auto e:nums)
      {
        k+=e;
      }
      if(k<target||-k>target)
      return 0;  //防止绝对不可能有任何组合结果为target导致数组越界
      nums.insert(nums.begin(),0);
      vector<vector<int>>dp(n+1,vector<int>(2*k+1,0));

      dp[0][k]=1;
      for(int i=1;i<=n;i++)
      {
        for(int j=0;j<=2*k;j++)
        {
            if(j-nums[i]>=0)
            dp[i][j]+=dp[i-1][j-nums[i]];
            if(j+nums[i]<=2*k)
            dp[i][j]+=dp[i-1][j+nums[i]];
        }
      }

      return dp[n][target+k];



    }
};

相关推荐

  1. 题解目标

    2024-07-18 08:38:06       23 阅读
  2. 目标

    2024-07-18 08:38:06       32 阅读
  3. 题解(一零)

    2024-07-18 08:38:06       27 阅读
  4. 494. 目标LeetCode)

    2024-07-18 08:38:06       36 阅读
  5. [题解]

    2024-07-18 08:38:06       31 阅读
  6. [题解]53. 最大子数组

    2024-07-18 08:38:06       31 阅读
  7. 1-100题解

    2024-07-18 08:38:06       41 阅读
  8. 题解(摆动序列)

    2024-07-18 08:38:06       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 08:38:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 08:38:06       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 08:38:06       58 阅读
  4. Python语言-面向对象

    2024-07-18 08:38:06       69 阅读

热门阅读

  1. oracle数据字典详解

    2024-07-18 08:38:06       17 阅读
  2. 自定义异常

    2024-07-18 08:38:06       21 阅读
  3. leetcode-46. 全排列

    2024-07-18 08:38:06       23 阅读
  4. 观察者模式-C#

    2024-07-18 08:38:06       26 阅读
  5. 掌握JVM调优:如何在Gradle中配置JVM参数?

    2024-07-18 08:38:06       20 阅读
  6. vue2.0中如何实现数据监听

    2024-07-18 08:38:06       21 阅读
  7. D365 Fraud Protection Loss Prevention产品介绍

    2024-07-18 08:38:06       22 阅读