原题链接在这里: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.
题解:
DP问题. 其实是找有没有sub array的数字和是sum(nums)/2. 存储到第 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:
1 class Solution { 2 public boolean canPartition(int[] nums) { 3 if(nums == null || nums.length == 0){ 4 return true; 5 } 6 7 int sum = 0; 8 for(int num : nums){ 9 sum += num; 10 } 11 12 return sum%2==1 ? false : subSum(nums, sum/2); 13 } 14 15 private boolean subSum(int [] nums, int sum){ 16 boolean [] dp = new boolean[sum+1]; 17 dp[0] = true; 18 for(int num : nums){ 19 for(int i = sum; i>=num; i--){ 20 dp[i] = dp[i] || dp[i-num]; 21 } 22 } 23 return dp[sum]; 24 } 25 }
类似Target Sum 的Method 2.
时间: 2024-11-08 20:35:30