题目来源:
leetcode题目,网址:LCR 101. 分割等和子集 - 力扣(LeetCode)
解题思路:
将数组分为等和的两部分等价于数组是否中存在部分元素和为数组总和的一半。
首先,若数组长度为 1 或数组总和为奇数,肯定不存在部分元素和为数组总和的一半。
接着,对数组进行动态规划,其中 dp[i][j] 表示前 i 个元素是否能使部分元素和为 j ,递推关系为 dp[i][j]=dp[i-1][j] || dp[i-1][j-nums[i]]。
最后返回结果即可。
解题代码:
- class Solution {
- public boolean canPartition(int[] nums) {
- int sum=Arrays.stream(nums).sum();
- if(nums.length==1 || sum%2!=0){
- return false;
- }
- int target=sum/2;
- boolean[][] dp=new boolean[nums.length][target+1];//dp[i][j] 0-i 范围内是否能通过求和得到 j
- for(int i=0;i<dp.length;i++){
- dp[i][0]=true;
- }
- for(int i=1;i<dp.length;i++){
- for(int j=0;j<dp[0].length;j++){
- dp[i][j]=dp[i-1][j];
- if(!dp[i][j] && j-nums[i]>=0){
- dp[i][j]=dp[i-1][j-nums[i]];
- }
- }
- if(dp[i][target]){
- return true;
- }
- }
- return dp[nums.length-1][target];
- }
- }
总结:
没做出来,看官方题解的。
这题是简单题,但是主站中与本题相同的题是中等题,搞不懂。