题目描述:
You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symbols +
and -
. For each integer, you should choose one from +
and -
as its new symbol.
Find out how many ways to assign symbols to make sum of integers equal to target S.
Example 1:
Input: nums is [1, 1, 1, 1, 1], S is 3. Output: 5 Explanation: -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 There are 5 ways to assign symbols to make the sum of nums be target 3.
Note:
- The length of the given array is positive and will not exceed 20.
- The sum of elements in the given array will not exceed 1000.
- Your output answer is guaranteed to be fitted in a 32-bit integer.
题目大意:
给定一组非负整数a1, a2, ..., an,以及一个目标数S。给定两种符号+和-,对于每一个整数,选择一个运算符。
计算有多少种运算符的组合方式,可以使整数的和为目标数S。
注意:
- 给定数组长度为正数并且不会超过20。
- 元素之和不会超过1000。
- 输出答案确保在32位整数范围内。
解题思路:
动态规划(Dynamic Programming)
状态转移方程:dp[i + 1][k + nums[i] * sgn] += dp[i][k] 上式中,sgn取值±1,k为dp[i]中保存的所有状态;初始令dp[0][0] = 1 利用滚动数组,可以将空间复杂度优化到O(n),n为可能的运算结果的个数
Python代码:
class Solution(object):
def findTargetSumWays(self, nums, S):
"""
:type nums: List[int]
:type S: int
:rtype: int
"""
dp = collections.Counter()
dp[0] = 1
for n in nums:
ndp = collections.Counter()
for sgn in (1, -1):
for k in dp.keys():
ndp[k + n * sgn] += dp[k]
dp = ndp
return dp[S]
本文链接:http://bookshadow.com/weblog/2017/01/22/leetcode-target-sum/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。