本题并没有很难,就是很常规的排列组合,但是没有做出来。😄。可能是因为作息不好吧。
    大致思路:

    • 穷举所有的排列组合
    • 利用类似DFS的方式进行遍历
    • 两种提前结束的可能(也是本题的相对难点):
      • 698. Partition to K Equal Sum Subsets[没有解出] - 图1的时候:说明之前的都满足
      • 当前的sumtargetSum相等的时候:可以去找下一个可能性;同时也要注意,remaining必须大于0,避免出现空的集合

    复杂度分析:

    • 时间复杂度:非常类似穷举698. Partition to K Equal Sum Subsets[没有解出] - 图2
    • 空间复杂度:用了额外的数组,所以是698. Partition to K Equal Sum Subsets[没有解出] - 图3

    代码如下所示:

    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. if (sum % k != 0) {
    8. return false;
    9. }
    10. boolean[] visited = new boolean[nums.length];
    11. return DFS(nums, visited, 0, 0, sum / k, k, nums.length);
    12. }
    13. private boolean DFS(int[] nums, boolean[] visited, int start, int currentSum, int target, int k, int remaining) {
    14. if (k == 1) {
    15. return true;
    16. }
    17. if (currentSum == target && remaining > 0) {
    18. // ensure no empty set
    19. return DFS(nums, visited, 0, 0, target, k - 1, remaining);
    20. }
    21. for (int i = start; i < nums.length; ++i) {
    22. if (!visited[i]) {
    23. visited[i] = true;
    24. if (DFS(nums, visited, i + 1, currentSum + nums[i], target, k, remaining - 1)) {
    25. return true;
    26. }
    27. visited[i] = false;
    28. }
    29. }
    30. return false;
    31. }
    32. }