LeetCode 416. 分割等和子集
题目描述
思路分析
- 我们首先计算整个数组的元素和
sum
,并且检查是否为奇数。如果sum
为奇数,那么不可能将其分割成两个和相等的子集,因此直接返回false
。- 将目标和
target
设为sum
的一半,因为如果可以找到一个子集的元素和为target
,那么另一个子集的元素和也会为target
。- 我们创建了一个一维数组
dp
,其中dp[i]
表示是否可以找到一个子集的元素和为i
。初始时,我们将dp[0]
设置为true
,因为可以选择不取任何元素来得到和为 0 的子集。- 遍历数组
nums
中的每个元素num
,然后从target
向num
遍历,更新dp
数组。具体的更新规则为dp[j] = dp[j] || dp[j-num]
,表示如果可以找到一个子集的元素和为j - num
,那么就可以找到一个子集的元素和为j
。这是典型的 01 背包问题思路。- 最终,返回
dp[target]
,表示是否可以找到一个子集的元素和为target
,即是否可以将原始数组分割成两个和相等的子集。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func canPartition(nums []int) bool {
sum := 0
for _, num := range nums {
sum += num
}
if sum%2 != 0 {
return false
}
target := sum / 2
dp := make([]bool, target+1) // dp[i] 表示是否可以找到一个子集的元素和为 i
dp[0] = true
for _, num := range nums {
for j := target; j >= num; j-- {
dp[j] = dp[j] || dp[j-num]
}
}
return dp[target]
}
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用