mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-08-06 09:29:56 +08:00
1.4 KiB
1.4 KiB
698.划分为k个相等的子集 的代码几乎不用改动,就可以AC
class Solution {
private:
bool backtracking(vector<int>& nums,
int k,
int target, // 子集目标和
int cur, // 当前目标和
int startIndex, // 起始位置
vector<bool>& used) { // 标记是否使用过
if (k == 0) return true; // 找到了k个相同子集
if (cur == target) { // 发现一个合格子集,然后重新开始寻找
return backtracking(nums, k - 1, target, 0, 0, used); // k-1
}
for (int i = startIndex; i < nums.size(); i++) {
if (cur + nums[i] <= target && !used[i]) {
used[i] = true;
if (backtracking(nums, k, target, cur + nums[i], i + 1, used)) {
return true;
}
used[i] = false;
}
}
return false;
}
public:
bool makesquare(vector<int>& nums) {
if (nums.size() < 4) return false; // 火柴数量小于4凑不上正方形
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (sum % 4 != 0) return false;
int target = sum / 4;
vector<bool> used(nums.size(), false);
return backtracking(nums, 4, target, 0, 0, used);
}
};