zoukankan      html  css  js  c++  java
  • LeetCode 416. 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:

    1. Each of the array element will not exceed 100.
    2. 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.

    跟上Partition to K Equal Sum Subsets.

  • 相关阅读:
    双向(端)链表、栈、队列
    WPF 3D基础(1)
    静态查找
    栈和队列 迷宫求解
    异步编程Demo
    WPF 3D基础(2)
    串操作
    链栈和链队
    Linux恢复数据
    word文件修复窍门
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/7609279.html
Copyright © 2011-2022 走看看