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 <= 161 <= 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