Files
leetcode-master/problems/0698.划分为k个相等的子集.md
youngyangyang04 0aaf6dd4b8 Update
2020-12-12 17:37:38 +08:00

1.4 KiB
Raw Blame History

使用回溯法首先要明确这是组合问题即集合里是不强调顺序的所以要用startIndex

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 canPartitionKSubsets(vector<int>& nums, int k) {
        //sort(nums.begin(), nums.end()); 不需要排序
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
        }
        if (sum % k != 0) return false;
        int target = sum / k;
        vector<bool> used(nums.size(), false);

        return backtracking(nums, k, target, 0, 0, used);
    }
};