Files
leetcode-master/problems/0473.火柴拼正方形.md
youngyangyang04 0aaf6dd4b8 Update
2020-12-12 17:37:38 +08:00

1.4 KiB
Raw Blame History

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);

    }
};