Leecode: Target Sum (JS解答)
解题思路:采用动态规划的思路,首先得出状态转移方程式:
dp[i][j] = dp[i - 1][j - nums[i]] + dp[i - 1][j + nums[i]];
但是这个不能拿来直接用,因为dp[i][j]依赖dp[i - 1][j - nums[i]],关键是这个nums[i],构成环状依赖了,所以需要对方程式进行变形处理才可以用:
dp[i][j] += dp [i-1][j-nums[i]]
dp[i][j] += dp [i-1][j+nums[i]] 然后=》
讲j用 j+nums[i ]和 j-nums[i] 替换掉,得到
dp[i][j + nums[i]] += dp[i - 1][j]
dp[i][j - nums[i]] += dp[i - 1][j]
上代码:
function findTargetSumWays(nums: number[], target: number): number {
let resArr:number[][] = new Array(nums.length);
for(let i = 0; i < resArr.length; i++){
resArr[i] = new Array(2002).fill(0);
}
resArr[0][nums[0]+1000] = 1; //加1000是为了防止出现负数下标
resArr[0][-nums[0]+1000] += 1;
for(let i = 1; i < nums.length; i++){
for(let sum = -1000; sum <= 1000; sum++){
if(resArr[i-1][sum+1000] > 0){
resArr[i][sum+nums[i]+1000] += resArr[i-1][sum+1000];
resArr[i][sum-nums[i]+1000] += resArr[i-1][sum+1000];
}
}
}
return target > 1000? 0 : resArr[nums.length-1][target+1000];
};