1296. Divide Array in Sets of K Consecutive Numbers
Description
Given an array of integers nums
and a positive integer k
, check whether it is possible to divide this array into sets of k
consecutive numbers.
Return true
if it is 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 = [1,2,3,4], k = 3 Output: false Explanation: Each array should be divided in subarrays of size 3.
Constraints:
1 <= k <= nums.length <= 105
1 <= nums[i] <= 109
Note: This question is the same as 846: https://leetcode.com/problems/hand-of-straights/
Solutions
Solution 1: Hash Table + Sorting
We use a hash table \(\textit{cnt}\) to count the occurrences of each number in the array \(\textit{nums}\), and then sort the array \(\textit{nums}\).
Next, we traverse the array \(\textit{nums}\). For each number \(v\) in the array, if the count of \(v\) in the hash table \(\textit{cnt}\) is not zero, we enumerate each number from \(v\) to \(v+k-1\). If the counts of these numbers in the hash table \(\textit{cnt}\) are all non-zero, we decrement the counts of these numbers by 1. If the count becomes zero after decrementing, we remove these numbers from the hash table \(\textit{cnt}\). Otherwise, it means we cannot divide the array into several subarrays of length \(k\), and we return false
. If we can divide the array into several subarrays of length \(k\), we return true
after the traversal.
The time complexity is \(O(n \times \log n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the array \(\textit{nums}\).
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Solution 1: Ordered Set
We can also use an ordered set to count the occurrences of each number in the array \(\textit{nums}\).
Next, we loop to extract the minimum value \(v\) from the ordered set, then enumerate each number from \(v\) to \(v+k-1\). If the occurrences of these numbers in the ordered set are all non-zero, we decrement the occurrence count of these numbers by 1. If the occurrence count becomes 0 after decrementing, we remove the number from the ordered set. Otherwise, it means we cannot divide the array into several subarrays of length \(k\), and we return false
. If we can divide the array into several subarrays of length \(k\), we return true
after the traversal.
The time complexity is \(O(n \times \log n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the array \(\textit{nums}\).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|