力扣算法 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);
}
}


浙公网安备 33010602011771号