共计 922 个字符,预计需要花费 3 分钟才能阅读完成。
一、题目粗心
标签: 动静布局
https://leetcode.cn/problems/partition-equal-subset-sum
给你一个 只蕴含正整数 的 非空 数组 nums。请你判断是否能够将这个数组宰割成两个子集,使得两个子集的元素和相等。
示例 1:
输出:nums = [1,5,11,5]
输入:true
解释:数组能够宰割成 [1, 5, 5] 和 [11]。
示例 2:
输出:nums = [1,2,3,5]
输入:false
解释:数组不能宰割成两个元素和相等的子集。
提醒:
1 <= nums.length <= 200
1 <= nums[i] <= 100
二、解题思路
设所有数字和为 sum,咱们的指标是选取一个子数组,使它的总和为 sum/2,定义二维 boolean 数组 dpi,其意义是应用前 i 个数字的和能不能形成整数 j。咱们须要把每个地位都进行遍历,同时也要对 0 -target 之间的所有负数进行遍历。状态转移方程是,遍历到 i 地位时能不能形成 target= 后面的数字的和能形成 target|| 后面的数字能形成 target-nums[i]。这两个状态别离是选不选取 nums[i] 的两种状况,如果有一种状况成立即可:
dpi = dpi-1 || dpi-1]
三、解题办法
3.1 Java 实现
public class Solution {public boolean canPartition(int[] nums) {
// 数组求和
int sum = Arrays.stream(nums).sum();
// 场景 1:和为奇数不能均分
if (sum % 2 == 1) {return false;}
int target = sum / 2;
int n = nums.length;
boolean[][] dp = new boolean[n + 1][target + 1];
dp[0][0] = true;
for (int i = 1; i <= n; i++) {for (int j = 0; j <= target; j++) {if (j < nums[i - 1]) {dp[i][j] = dp[i - 1][j];
} else {dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i - 1]];
}
}
}
return dp[n][target];
}
}
四、总结小记
- 2022/6/29 期待 7.5 号
正文完