-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0659-split-array-into-consecutive-subsequences.js
More file actions
63 lines (57 loc) · 1.8 KB
/
0659-split-array-into-consecutive-subsequences.js
File metadata and controls
63 lines (57 loc) · 1.8 KB
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
* Split Array Into Consecutive Subsequences
* Time Complexity: O(N)
* Space Complexity: O(N)
*/
var isPossible = function (nums) {
const initialFrequencies = new Map();
const subsequenceNextExpected = new Map();
for (const numberValue of nums) {
initialFrequencies.set(
numberValue,
(initialFrequencies.get(numberValue) || 0) + 1,
);
}
for (const processedNumber of nums) {
const currentNumberAvailable = initialFrequencies.get(processedNumber) || 0;
if (currentNumberAvailable === 0) {
continue;
}
const nextExpectedForSubsequence =
subsequenceNextExpected.get(processedNumber) || 0;
if (nextExpectedForSubsequence > 0) {
subsequenceNextExpected.set(
processedNumber,
nextExpectedForSubsequence - 1,
);
initialFrequencies.set(processedNumber, currentNumberAvailable - 1);
subsequenceNextExpected.set(
processedNumber + 1,
(subsequenceNextExpected.get(processedNumber + 1) || 0) + 1,
);
} else {
const nextConsecutiveAvailable =
initialFrequencies.get(processedNumber + 1) || 0;
const twoAheadConsecutiveAvailable =
initialFrequencies.get(processedNumber + 2) || 0;
if (nextConsecutiveAvailable > 0 && twoAheadConsecutiveAvailable > 0) {
initialFrequencies.set(processedNumber, currentNumberAvailable - 1);
initialFrequencies.set(
processedNumber + 1,
nextConsecutiveAvailable - 1,
);
initialFrequencies.set(
processedNumber + 2,
twoAheadConsecutiveAvailable - 1,
);
subsequenceNextExpected.set(
processedNumber + 3,
(subsequenceNextExpected.get(processedNumber + 3) || 0) + 1,
);
} else {
return false;
}
}
}
return true;
};