LeetCode 494. 目标和

题目描述

494. 目标和

image-20250528222343729

image-20250528222357165

思路分析

这个问题本质上是一个“背包问题”的变种问题,类似于“和为某个目标的子集和”问题。

假设数组中有一些数加上去,另一些数减去去。假设加上去的数的和是 P,减去去的数的和是 Q,那么就有:

P - Q = S P + Q = sum(nums)

由此我们可以推导出:P = (sum(nums) + S) / 2

也就是说,问题转化成了如何从数组 nums 中找到一些数,使得它们的和为 P。这个问题变成了一个经典的“背包问题”,可以通过动态规划来求解。

image-20250528213256519

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func findTargetSumWays(nums []int, S int) int {
	sum := 0
	for _, num := range nums {
		sum += num
	}

	if (sum+S)%2 != 0 {
		return 0
	}

	target := (sum + S) / 2
	if target < 0 {
		return 0
	}

	dp := make([]int, target+1)
	dp[0] = 1

	for _, num := range nums {
		for i := target; i >= num; i-- {
			dp[i] += dp[i-num]
		}
	}

	return dp[target]
}

➡️ 点击查看 Java 题解

1
write your code here
1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/25056900
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!