mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
494.目标和增加Go二维dp解法
This commit is contained in:
@ -675,6 +675,57 @@ class Solution:
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Go
|
### Go
|
||||||
|
二维dp
|
||||||
|
```go
|
||||||
|
func findTargetSumWays(nums []int, target int) int {
|
||||||
|
sum := 0
|
||||||
|
for _, v := range nums {
|
||||||
|
sum += v
|
||||||
|
}
|
||||||
|
if math.Abs(float64(target)) > float64(sum) {
|
||||||
|
return 0 // 此时没有方案
|
||||||
|
}
|
||||||
|
if (target + sum) % 2 == 1 {
|
||||||
|
return 0 // 此时没有方案
|
||||||
|
}
|
||||||
|
bagSize := (target + sum) / 2
|
||||||
|
|
||||||
|
dp := make([][]int, len(nums))
|
||||||
|
for i := range dp {
|
||||||
|
dp[i] = make([]int, bagSize + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化最上行
|
||||||
|
if nums[0] <= bagSize {
|
||||||
|
dp[0][nums[0]] = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化最左列,最左列其他数值在递推公式中就完成了赋值
|
||||||
|
dp[0][0] = 1
|
||||||
|
|
||||||
|
var numZero float64
|
||||||
|
for i := range nums {
|
||||||
|
if nums[i] == 0 {
|
||||||
|
numZero++
|
||||||
|
}
|
||||||
|
dp[i][0] = int(math.Pow(2, numZero))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 以下遍历顺序行列可以颠倒
|
||||||
|
for i := 1; i < len(nums); i++ { // 行,遍历物品
|
||||||
|
for j := 0; j <= bagSize; j++ { // 列,遍历背包
|
||||||
|
if nums[i] > j {
|
||||||
|
dp[i][j] = dp[i-1][j]
|
||||||
|
} else {
|
||||||
|
dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[len(nums)-1][bagSize]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
一维dp
|
||||||
```go
|
```go
|
||||||
func findTargetSumWays(nums []int, target int) int {
|
func findTargetSumWays(nums []int, target int) int {
|
||||||
sum := 0
|
sum := 0
|
||||||
|
Reference in New Issue
Block a user