😑698. Partition to K Equal Sum Subsets

https://leetcode.com/problems/partition-to-k-equal-sum-subsets/submissions/

思路其实很巧妙很简单,要把nums分成k组,那我就dfs来决定每个元素放在哪个组(bucket)里就好了,超级容易TLE,防止TLE的关键是注释框起来那一行,如果在某个index这里某个bucket dfs到底了返回回来发现仍然是空的就可以直接return false了,不可能有解的。你可能在想我这个bucket可能根本没有进dfs呀,如果是那样的话由于现在bucket为空,说明有一个元素自身就比target大,那它分到哪一组都不可能,所以也不可能。

class Solution {
    public boolean canPartitionKSubsets(int[] nums, int k) {
        int total = 0;
        for (int num : nums) total += num;
        if (total % k != 0) return false;
        int sum = total / k;
        int[] sums = new int[k];
        return dfs(nums, 0, sum, k, sums);
    }
    private boolean dfs(int[] nums, int index, int sum, int k, int[] sums) {
        if (index == nums.length) {
            for (int i = 0; i < k; i++) {
                if (sums[i] != sum) {
                    return false;
                }
            }
            return true;
        }
        for (int i = 0; i < k; i++) {
            if (sums[i] + nums[index] <= sum) {
                sums[i] += nums[index];
                //if we can fill all buckets then return true
                if (dfs(nums, index + 1, sum, k, sums)) return true;
                
                //means we can't fill other buckets if we take ith element 
                // so leave this element
                sums[i] -= nums[index];
            }
            // *********************IMPORTANT***********************
            if (sums[i] == 0) break;
            // *********************IMPORTANT***********************
        }
        return false;
    }
}

Last updated