Skip to content

698. Partition To K Equal Sum Subsets

Difficulty: Medium

LeetCode Problem View on GitHub


698. Partition to K Equal Sum Subsets

Medium


Given an integer array nums and an integer k, return true if it is possible to divide this array into k non-empty subsets whose sums are all equal.

 

Example 1:

Input: nums = [4,3,2,3,5,2,1], k = 4
Output: true
Explanation: It is possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.

Example 2:

Input: nums = [1,2,3,4], k = 3
Output: false

 

Constraints:

  • 1 <= k <= nums.length <= 16
  • 1 <= nums[i] <= 104
  • The frequency of each element is in the range [1, 4].

Solution

class Solution {
    private int flag;
    private Map<String, Boolean> memo;
    public boolean canPartitionKSubsets(int[] nums, int k) {
        int n = nums.length, sum = 0;
        flag = 0;
        for (int ele : nums) sum += ele;
        if (sum % k != 0) return false;
        int target = sum / k;
        memo = new HashMap<>();
        Arrays.sort(nums);
        reverse(nums);
        return solve(0, 0, nums, new boolean[n], k, target);
    }
    private boolean solve(int curIndex, int curSum, int[] nums, boolean[] visited, int k, int target) {
        if (k == 1) return true; 
        String memoKey = curSum + "-" + k + "-" + java.util.Arrays.toString(visited);
        if (memo.containsKey(memoKey)) return memo.get(memoKey);
        if (curSum == target) {
            boolean result = solve(0, 0, nums, visited, k - 1, target);
            memo.put(memoKey, result);
            return result;
        }
        for (int i = curIndex; i < nums.length; i++) {
            if (!visited[i] && curSum + nums[i] <= target) {
                visited[i] = true;
                if (solve(i + 1, curSum + nums[i], nums, visited, k, target)) {
                    memo.put(memoKey, true);
                    return true;
                }
                visited[i] = false; 
            }
        }
        memo.put(memoKey, false);
        return false;
    }
    private void reverse(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int temp = nums[left];
            nums[left++] = nums[right];
            nums[right--] = temp;
        }
    }
}

Complexity Analysis

  • Time Complexity: O(?)
  • Space Complexity: O(?)

Approach

Detailed explanation of the approach will be added here