698.partition-to-k-equal-sum-subsets 劃為k個相等的子集
阿新 • • 發佈:2022-12-08
問題描述
解題思路
首先,對陣列按照從大到小排序,相比從小到大排序,能避免[1, 1, 2, 2]這樣的陣列的誤判;
利用used[i]
陣列避免重複使用同一個元素,如果sum == target
,就將sum
置零,如果cnt == k
,說明滿足條件。
程式碼
class Solution { public: bool dfs(vector<int> &nums, int index, int sum, int target, int cnt, int k, vector<int> &used, int idx) { if (cnt == k) return true; if (sum == target) { return dfs(nums, idx - 1, 0, target, cnt + 1, k, used, idx - 1); //注意這裡是idex - 1而不是index - 1 } for (int i = index; i >= 0; i--) { if (used[i] || sum + nums[i] > target) continue; used[i] = 1; if (dfs(nums, i - 1, sum + nums[i], target, cnt, k, used, idx)) return true; used[i] = 0; if (sum == 0) return false; } return false; } bool canPartitionKSubsets(vector<int> &nums, int k) { int sum = 0; for (int i : nums) sum += i; if (sum % k != 0) return false; std::sort(nums.begin(), nums.end()); if (nums.back() > sum / k) return false; vector<int> used(nums.size(), 0); return dfs(nums, nums.size() - 1, 0, sum / k, 0, k, used, nums.size() - 1); } };