Leetcodes
698. 划分为k个相等的子集
Tag: 回溯算法 Mid
给定一个整数数组 nums
和一个正整数 k
,找出是否有可能把这个数组分成 k
个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
示例 2:
输入: nums = [1,2,3,4], k = 3
输出: false
提示:
1 <= k <= len(nums) <= 16
0 < nums[i] < 10000
- 每个元素的频率在
[1,4]
范围内
class Solution {
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
if (k > nums.size()) {
return false;
}
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (sum % k != 0) { // 确保总和能够整除 k
return false;
}
int target = sum / k;
vector<int> bucket(k, 0); // 使用 vector 替代裸指针
return backtrack(nums, target, bucket, 0);
}
bool backtrack(vector<int>& nums, int target, vector<int>& bucket, int index) {
if (index == nums.size()) {
for (int i = 0; i < bucket.size(); i++) {
if (bucket[i] != target) {
return false;
}
}
return true;
}
for (int i = 0; i < bucket.size(); i++) {
if (bucket[i] + nums[index] > target) {
continue;
}
bucket[i] += nums[index];
if (backtrack(nums, target, bucket, index + 1)) {
return true;
}
bucket[i] -= nums[index];
}
return false;
}
};
- 刷算法题还是直接用vector
- 确定好回溯算法的选择和状态转移