题目要求将数组 nums 中的元素分组使得每组的大小是 k。假设数组 nums 的长度是 n,只有当 n \bmod k = 0 时才可能完成分组,因此如果 n \bmod k \ne 0 则直接返回 false。
当 n \bmod k = 0 时,可以将数组 nums 中的元素分组使得每组的大小是 k,此时需要判断是否存在一种分组方式使得同一组的元素都是连续的。
由于每个元素都必须被分到某个组,因此可以使用贪心的策略。假设尚未分组的元素中,最小的数字是 x,则如果存在符合要求的分组方式,x 一定是某个组中的最小数字(否则 x 不属于任何一个组,不符合每个元素都必须被分到某个组),该组的数字范围是 [x, x + k - 1]。在将 x 到 x + k - 1 的 k 个元素分成一个组之后,继续使用贪心的策略对剩下的元素分组,直到所有的元素分组结束或者无法完成分组。如果在分组过程中发现从最小数字开始的连续 k 个数字中有不存在的数字,则无法完成分组。
publicclassSolution { publicboolIsPossibleDivide(int[] nums, int k) { int n = nums.Length; if (n % k != 0) { returnfalse; } Array.Sort(nums); Dictionary<int, int> cnt = new Dictionary<int, int>(); foreach (int x in nums) { if (!cnt.ContainsKey(x)) { cnt.Add(x, 0); } cnt[x]++; } foreach (int x in nums) { if (!cnt.ContainsKey(x)) { continue; } for (int j = 0; j < k; j++) { int num = x + j; if (!cnt.ContainsKey(num)) { returnfalse; } cnt[num]--; if (cnt[num] == 0) { cnt.Remove(num); } } } returntrue; } }
classSolution { public: boolisPossibleDivide(vector<int>& nums, int k){ int n = nums.size(); if (n % k != 0) { returnfalse; } sort(nums.begin(), nums.end()); unordered_map<int, int> cnt; for (auto & num : nums) { cnt[num]++; } for (auto & x : nums) { if (!cnt.count(x)) { continue; } for (int j = 0; j < k; j++) { int num = x + j; if (!cnt.count(num)) { returnfalse; } cnt[num]--; if (cnt[num] == 0) { cnt.erase(num); } } } returntrue; } };
var isPossibleDivide = function(nums, k) { const n = nums.length; if (n % k !== 0) { returnfalse; } nums.sort((a, b) => a - b); const cnt = newMap(); for (const x of nums) { cnt.set(x, (cnt.get(x) || 0) + 1); } for (const x of nums) { if (!cnt.has(x)) { continue; } for (let j = 0; j < k; j++) { const num = x + j; if (!cnt.has(num)) { returnfalse; } cnt.set(num, cnt.get(num) - 1); if (cnt.get(num) == 0) { cnt.delete(num); } } } returntrue; };
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defisPossibleDivide(self, nums: List[int], k: int) -> bool: iflen(nums) % k > 0: returnFalse nums.sort() cnt = Counter(nums) for x in nums: if cnt[x] == 0: continue for num inrange(x, x + k): if cnt[num] == 0: returnFalse cnt[num] -= 1 returnTrue
funcisPossibleDivide(nums []int, k int)bool { iflen(nums)%k > 0 { returnfalse } sort.Ints(nums) cnt := map[int]int{} for _, num := range nums { cnt[num]++ } for _, x := range nums { if cnt[x] == 0 { continue } for num := x; num < x+k; num++ { if cnt[num] == 0 { returnfalse } cnt[num]-- } } returntrue }