力扣算法 Java 刷题笔记【回溯算法篇 DFS】hot100(二)划分为k个相等的子集、括号生成 2

1. 划分为 k 个相等的子集(中等)

地址: https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets/
2022/01/27
做题反思:

class Solution {
    public boolean canPartitionKSubsets(int[] nums, int k) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        int n = nums.length;
        if (n < k || sum % k != 0) {
            return false;
        }
        int target = sum / k;
        boolean[] used = new boolean[n];
        return backtrack(nums, k, target, 0, 0, used);
    }

    boolean backtrack(int[] nums, int k, int target, int bucket, int start, boolean[] used) {
        if (bucket == target) {
            return backtrack(nums, k - 1, target, 0, 0, used);
        }
        if (k == 0) {
            return true;   
        }
        for (int i = start; i < nums.length; i++) {
            if (bucket + nums[i] > target) {
                continue;
            }
            if (used[i]) {
                continue;
            }
            bucket += nums[i];
            used[i] = true;
            if (backtrack(nums, k, target, bucket, i + 1, used)) {
                return true;
            }
            bucket -= nums[i];
            used[i] = false;
        }
        return false;
    }
}

在这里插入图片描述

2. 括号生成(中等)

地址: https://leetcode-cn.com/problems/generate-parentheses/
2022/01/27
做题反思:

class Solution {
    List<String> res = new LinkedList<>();
    public List<String> generateParenthesis(int n) {
        StringBuilder track = new StringBuilder();
        backtrack(n, n, n, track);
        return res;
    }
    void backtrack(int left, int right, int n, StringBuilder track) {
        if (right < left) {
            return;
        }
        if (left < 0 || right < 0) {
            return;
        }
        if (left == 0 && right == 0) {
            res.add(track.toString());
            return;
        }

        track.append('(');
        backtrack(left - 1, right, n, track);
        track.deleteCharAt(track.length() - 1);

        track.append(')');
        backtrack(left, right - 1, n, track);
        track.deleteCharAt(track.length() - 1);
    }
}

在这里插入图片描述

posted @ 2022-03-04 23:03  涤心  阅读(38)  评论(0)    收藏  举报