思路:数组
要特殊注意:spa
dp = [[0 for i in range(2 * total + 1)] for j in range(len(nums))] # 若是数组的第一个元素为0,那么+0或是-0,结果都为0 if nums[0] == 0: dp[0][total] = 2 else: # total是数组元素的和,也是dp的行中,元素值为0的元素的下标 dp[0][total + nums[0]] = 1 dp[0][total - nums[0]] = 1 for i in range(1, len(dp)): for j in range(len(dp[0])): # 注意边界 # 在第一个图中,dp[4][0]的当前元素值是1,对应的目标值是-5,那么-5加上或减去1多是上一行获得的值,可是要注意-5-1也就是-6不在考虑范围内 # left和right都初始化为0,是由于在表格也就是二维数组中,0所在的列所对应的目标值是给定数组的全部元素可能获得的最小值,是一个极值,因此不到最后一行,也就是不遍历到最后一个数组元素是得不到这个值的,也就是,全部行的下标为0的位置(全部行的起始位置)的方法数必定是0,因此当left或right越界了,没有被赋新的值时,不会影响计算方法数 left, right = 0, 0 if j - nums[i] >= 0: left = j - nums[i] if j + nums[i] < 2 * total + 1: right = j + nums[i] dp[i][j] = dp[i - 1][left] + dp[i - 1][right] return dp[-1][total + S]
class Solution: def findTargetSumWays(self, nums: List[int], S: int) -> int: total = sum(nums) if total < S: return 0 dp = [[0 for i in range(2 * total + 1)] for j in range(len(nums))] if nums[0] == 0: dp[0][total] = 2 else: dp[0][total + nums[0]] = 1 dp[0][total - nums[0]] = 1 for i in range(1, len(dp)): for j in range(len(dp[0])): left, right = 0, 0 if j - nums[i] >= 0: left = j - nums[i] if j + nums[i] < 2 * total + 1: right = j + nums[i] dp[i][j] = dp[i - 1][left] + dp[i - 1][right] return dp[-1][total + S]