leetcode443,leetcode474

  leetcode443,leetcode474

  LeetCod:494。目标总和

  给你一个非负整数列表,a1,a2,一个an和一个目标s现在你有两个符号和。对于每个整数,应该从和-中选择一个作为它的新符号。找出有多少种方法分配符号使整数之和等于目标S .例1:input t:nums是[1,1,1,1,1],S是3。output:5解释:-1 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 1 1 1 1 1-1=3有5种分配符号的方法使nums之和为target 3。注意:给定数组的长度是正数,不会超过20。给定数组中元素的总和不会超过1000。您的输出答案保证符合32位整数。给定一个数组和一个目标值,将数组中的元素相加或相减,最终得到目标值。找出所有可能情况的数字。

  想法一:递归取nums=[1,1,1,1,1],S=3。最终需要的结果是3,数组的最后一个元素是1,所以可以分为两种情况:

  [1,1,1,1]的目标值是4,然后减1得到3;[1,1,1,1]的目标值是2,然后加1得到3;以此类推,直到只剩下最后一个数字。

Python 实现代码

  class Solution:def findTargetSumWays(self,nums: List[int],S:int)-int:RES=self . helper(nums,S) return res def helper(self,nums,S): l=len(nums) if (l 1): #越界,无解if(ABS(S)sum(nums)):RES=0 eelse:# S nums[-1]和S-nums[-1]RES=self . helper(nums)S nums[-1])self . helper(S 0和-0有相同的结果if (nums [0]==0和s==0):RES=2 elif(nums[0]==ABS(s)):RES=1 else:RES=0 # print(nums,s,res) return res思路二:动态规划的问题是要不要选择这个背包。 那么我们可以映射到:选择加号或者减号。因为负号不好,所以我们把总数向右移动。

  以[1,1,1,1,1]为例,表示为-5到5。然后我们就直接映射到0到10,变成[2,2,2,2]。所以背包容量10,1意味着背包容量2。

  选择一个背包10-2=8,就只剩下一个8容量的背包了。从0开始,值为0的方案数为1,即不为任何背包选择[0,0,0,0]。

  

Python 代码实现

  类解:def findTargetSumWays(self,nums: List[int],S:int)-int:sumAll=sum(nums)A=sumAll * 2 1 if(S=A或S sumAll=A):return 0 Dp=[0]* A Dp[0]=1 For I in range(len(nums)):nums[I]=2 * nums[I]For I in range(len(nums)):For j in range(nums[I],a) [:-1]: dp [j]=dp [j然后将nums的每个元素乘以2。最后一个双循环是迭代计算每个位置的元素之和的情况数。里面的核心代码是dp[j]=dp[j-nums[i]]。

  结束了。

leetcode443,leetcode474