Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/1296.html
1296. Divide Array in Sets of K Consecutive Numbers (Medium)
Given an array of integers nums
and a positive integer k
, find whether it's possible to divide this array into sets of k
consecutive numbers
Return True
if its possible otherwise return False
.
Example 1:
Input: nums = [1,2,3,3,4,4,5,6], k = 4 Output: true Explanation: Array can be divided into [1,2,3,4] and [3,4,5,6].
Example 2:
Input: nums = [3,2,1,2,3,4,3,4,5,9,10,11], k = 3 Output: true Explanation: Array can be divided into [1,2,3] , [2,3,4] , [3,4,5] and [9,10,11].
Example 3:
Input: nums = [3,3,2,2,1,1], k = 3 Output: true
Example 4:
Input: nums = [1,2,3,4], k = 3 Output: false Explanation: Each array should be divided in subarrays of size 3.
Constraints:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
1 <= k <= nums.length
Note: This question is the same as 846: https://leetcode.com/problems/hand-of-straights/
Similar Questions:
Solution 1.
-
class Solution { public boolean isPossibleDivide(int[] nums, int k) { int length = nums.length; if (length % k != 0) return false; Arrays.sort(nums); List<Integer> list = new ArrayList<Integer>(); for (int num : nums) list.add(num); while (!list.isEmpty()) { int min = list.remove(0); for (int i = min + 1; i <= min + k - 1; i++) { if (!list.contains(i)) return false; list.remove(new Integer(i)); } } return true; } } ############ class Solution { public boolean isPossibleDivide(int[] nums, int k) { Map<Integer, Integer> cnt = new HashMap<>(); for (int v : nums) { cnt.put(v, cnt.getOrDefault(v, 0) + 1); } Arrays.sort(nums); for (int v : nums) { if (cnt.containsKey(v)) { for (int x = v; x < v + k; ++x) { if (!cnt.containsKey(x)) { return false; } cnt.put(x, cnt.get(x) - 1); if (cnt.get(x) == 0) { cnt.remove(x); } } } } return true; } }
-
class Solution: def isPossibleDivide(self, nums: List[int], k: int) -> bool: cnt = Counter(nums) for v in sorted(nums): if cnt[v]: for x in range(v, v + k): if cnt[x] == 0: return False cnt[x] -= 1 if cnt[x] == 0: cnt.pop(x) return True ############ # 1296. Divide Array in Sets of K Consecutive Numbers # https://leetcode.com/problems/divide-array-in-sets-of-k-consecutive-numbers/ class Solution: def isPossibleDivide(self, nums: List[int], k: int) -> bool: n = len(nums) if n % k != 0: return False c = collections.Counter(nums) cs = sorted(c.keys()) def findStart(): for key in cs: if c[key] > 0: return key for t in range(n//k): start = findStart() for i in range(start, start+k): if c[i] > 0: c[i] -= 1 else: return False return True def isPossibleDivide(self, nums: List[int], k: int) -> bool: n = len(nums) if n % k != 0: return False count = collections.Counter(nums) keys = sorted(count) for key in keys: if count[key] > 0: c = count[key] for i in range(key, key+k): if count[i] < c: return False count[i] -= c return True
-
func isPossibleDivide(nums []int, k int) bool { cnt := map[int]int{} for _, v := range nums { cnt[v]++ } sort.Ints(nums) for _, v := range nums { if _, ok := cnt[v]; ok { for x := v; x < v+k; x++ { if _, ok := cnt[x]; !ok { return false } cnt[x]-- if cnt[x] == 0 { delete(cnt, x) } } } } return true }
-
class Solution { public: bool isPossibleDivide(vector<int>& nums, int k) { unordered_map<int, int> cnt; for (int& v : nums) ++cnt[v]; sort(nums.begin(), nums.end()); for (int& v : nums) { if (cnt.count(v)) { for (int x = v; x < v + k; ++x) { if (!cnt.count(x)) { return false; } if (--cnt[x] == 0) { cnt.erase(x); } } } } return true; } };