leetcode

Solution to some Leetcode problems written in C++
git clone git://git.dimitrijedobrota.com/leetcode.git
Log | Files | Refs | README | LICENSE

0698.cpp (1900B)


0 class Solution {
1 public:
2 bool canPartitionKSubsets(vector<int> &nums, int k) const {
3 int acc = 0;
5 for (const int n : nums)
6 acc += n;
7 if (acc % k) return false;
9 const int goal = acc / k;
11 sort(rbegin(nums), rend(nums));
12 if (nums[0] > goal) return false;
14 const function<bool(uint16_t, int, int, int)> rec = [&](uint16_t visited, int left, int sum,
15 int start) {
16 if (sum == goal) left--, sum = 0, start = 0;
17 if (left == 1) return true;
19 for (int i = start; i < size(nums); i++) {
20 const uint16_t mask = 1 << i;
21 if (visited & mask) continue;
22 if (sum + nums[i] > goal) continue;
24 if (rec(visited | mask, left, sum + nums[i], i + 1)) return true;
25 if (sum == 0) return false;
26 }
28 return false;
29 };
31 return rec(1, k, nums[0], 1);
32 }
33 };
35 class Solution {
36 public:
37 bool canPartitionKSubsets(vector<int> &nums, int k) const {
38 static int acc[16];
39 int sum = 0;
41 for (const int n : nums)
42 sum += n;
43 if (sum % k) return false;
45 const int goal = sum / k;
47 sort(rbegin(nums), rend(nums));
48 if (nums[0] > goal) return false;
50 memset(acc, 0x00, sizeof(acc));
51 acc[0] = nums[0];
53 function<bool(int)> rec = [&](int crnt) {
54 if (crnt == size(nums)) return true;
56 for (int i = 0; i < k; i++) {
57 if (acc[i] + nums[crnt] > goal) continue;
59 acc[i] += nums[crnt];
60 if (rec(crnt + 1)) return true;
61 acc[i] -= nums[crnt];
63 if (acc[i] == 0) return false;
64 }
66 return false;
67 };
69 return rec(1);
70 }
71 };