LeetCode Partition Equal Subset Sum
Posted Dylan_Java_NYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Partition Equal Subset Sum相关的知识,希望对你有一定的参考价值。
原题链接在这里:https://leetcode.com/problems/partition-equal-subset-sum/description/
题目:
Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.
Note:
- Each of the array element will not exceed 100.
- The array size will not exceed 200.
Example 1:
Input: [1, 5, 11, 5] Output: true Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:
Input: [1, 2, 3, 5] Output: false Explanation: The array cannot be partitioned into equal sum subsets.
题解:
其实是找有没有sub array的数字和是sum/2. Thus for the other half, sum must be sum/2.
Let dp[i] denotes if there is subarray sum equal to j.
dp[0] = true.
Then for each num in nums, dp[num] would be true.
Thus for i, check if dp[i-num], if dp[i-num] is true. Then dp[i] msut be true.
存储到第 i 个数能不能合成 j.
dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i]]. 两种情况,一种是不用当前的数字nums[i]. 就看之前的数字能不能合成j, dp[i-1][j]. 另一种是用当前的数字nums[i], 看之前的数字能不能合成j-nums[i], dp[i-1][j-nums[i]].
初始化dp[i][0]不论用几个数,总能合成0.
优化空间可用一维数组. 但注意循环从后往前,因为新的iteration 会用到旧的iteration 当前位置前面的值.
Time Complexity: O(sum*nums.length). sum = sum(nums)/2.
Space: O(sum).
AC Java:
class Solution { public boolean canPartition(int[] nums) { if(nums == null || nums.length == 0){ return true; } int sum = 0; for(int num : nums){ sum += num; } if(sum % 2 != 0){ return false; } int target = sum/2; boolean [] dp = new boolean[target+1]; dp[0] = true; for(int num : nums){ for(int i = target; i>=num; i--){ dp[i] = dp[i] || dp[i-num]; } } return dp[target]; } }
类似Target Sum 的Method 2.
以上是关于LeetCode Partition Equal Subset Sum的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode: Partition Equal Subset Sum
[leetcode-663-Equal Tree Partition]
[动态规划] leetcode 416 Partition Equal Subset Sum
[LeetCode] 416 Partition Equal Subset Sum