原题链接在这里:https://leetcode.com/problems/partition-to-k-equal-sum-subsets/description/
题目:
Given an array of integers nums
and a positive integer k
, find whether it's 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's possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.
Note:
1 <= k <= len(nums) <= 16
.0 < nums[i] < 10000
.
题解:
首先计算sum, 看sum能否被k整除. 若不能, 铁定不能分成k组. return false.
若能的话,每组的target sum就该是sum/k. 一组一组的减掉. 直到 k = 1. 剩下最后一组, 最后一组的sum肯定是sum/k.
因为这里的已经验证过sum是k的倍数, 而前面已经有k-1组 sum/k找到了. 所以可以直接return true.
Time Complexity: exponential.
Space: O(k*n). stack space.
AC Java:
1 class Solution { 2 public boolean canPartitionKSubsets(int[] nums, int k) { 3 int sum = 0; 4 for(int num : nums){ 5 sum += num; 6 } 7 8 if(k<=0 || sum%k!=0){ 9 return false; 10 } 11 12 boolean [] visited = new boolean[nums.length]; 13 return canPartition(nums, k, visited, 0, 0, 0, sum/k); 14 } 15 16 private boolean canPartition(int [] nums, int k, boolean [] visited, int start, int curCount, int curSum, int target){ 17 if(k == 1){ 18 return true; 19 } 20 21 if(curSum == target && curCount>0){ 22 return canPartition(nums, k-1, visited, 0, 0, 0, target); 23 } 24 25 for(int i = start; i<nums.length; i++){ 26 if(!visited[i]){ 27 visited[i] = true; 28 if(canPartition(nums, k, visited, i+1, curCount++, curSum+nums[i], target)){ 29 return true; 30 } 31 visited[i] = false; 32 } 33 } 34 return false; 35 } 36 }