思路:數組
要特殊注意: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]