题目

https:leetcode.cn/problems/partition-equal-subset-sum/description/?envType=daily-question&envId=2025-04-07

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

实现

分析

思路:典型 01 背包问题,动态规划 问题转化:是否存在字符组元素和为 sum/2 dp 定义:dp[i][j] 表示前 i 个元素能否和第 j 个元素组成满足条件的子数组 状态转移:

  • 不选当前数: dp[i][j] = dp[i-1][j]
  • 选当前数: dp[i][j] = dp[i-1][j-nums[i]] 注意:sum/2 为奇数时直接返回 false 复杂度:
  • 时间复杂度:
  • 空间复杂度:
/**
 * @param {string} s
 * @return {string}
 */
var canPartition = function (nums) {
    const sum = nums.reduce((a, b) => a + b, 0);
    if (sum % 2 !== 0) return false;
 
    const target = sum / 2;
    const dp = new Array(target + 1).fill(false);
    dp[0] = true;
 
    for (const num of nums) {
        for (let j = target; j >= num; j--) {
            dp[j] = dp[j] || dp[j - num];
        }
    }
    return dp[target];
};