第9章|动态规划
Unit 06 · LeetCode #416 分割等和子集
倒序不是背诵规则,
而是在保护“上一层状态”。
本单元把“分成两组相等”改写为“从每个位置至多选择一次,凑出总和的一半”。先用二维表看见旧层与新层,再压缩为一维数组,并亲眼观察正序更新如何让同一元素在一轮中被重复使用。
已恢复上次学习位置阶段、动画、答题、代码槽位和迁移进度均已恢复。
知识桥梁|Unit 05 → Unit 06
Unit 05:完全选择
同一种硬币可以反复使用;金额正序计算不会违反题意。
可重复使用 → 每个位置一次
Unit 06:0/1 选择
每个数组位置只能选或不选一次;压缩后必须防止读取本轮刚写入的状态。
本单元贯穿问题当前来源格属于处理 number 之前的旧层,还是本轮刚由同一个 number 写出的新状态?
LeetCode #416 原题题面转述、示例、约束与提交签名
题目要求
给定整数数组 nums,判断能否将所有元素分成两个子集,使两个子集的元素和相等。每个数组位置必须归入其中一个子集,因此在寻找其中一组时,每个位置最多使用一次。
from typing import List
class Solution:
def canPartition(self, nums: List[int]) -> bool:
pass
约束
1 ≤ nums.length ≤ 2001 ≤ nums[i] ≤ 100
示例
输入:nums = [1,5,11,5]
输出:true
解释:[1,5,5] 与 [11] 的和均为 11。
输出:true
解释:[1,5,5] 与 [11] 的和均为 11。
输入:nums = [1,2,3,5]
输出:false
解释:总和为 11,无法分成两个整数和相等的子集。
输出:false
解释:总和为 11,无法分成两个整数和相等的子集。
目标复杂度
设总和为 S,目标为 S/2。时间复杂度 O(nS),一维状态空间 O(S)。
状态语义 → 旧层保护
完成当前状态问题后继续
本环节已完成
请停留观察当前状态,确认你能解释当前来源格的层级语义。