You are given an integer array sorted in ascending order (may contain duplicates), you need to split them into several subsequences, where each subsequences consist of at least 3 consecutive integers. Return whether you can make such a split.
Example 1:
Input: [1,2,3,3,4,5]
Output: True
Explanation:
You can split them into two consecutive subsequences :
1, 2, 3
3, 4, 5
Example 2:
Input: [1,2,3,3,4,4,5,5]
Output: True
Explanation:
You can split them into two consecutive subsequences :
1, 2, 3, 4, 5
3, 4, 5
Example 3:
Input: [1,2,3,4,4,5]
Output: False
Note:
The length of the input is in range of [1, 10000]
class Solution {
public boolean isPossible(int[] nums) {
Integer prev = null;
int prevCount = 0;
Queue<Integer> starts = new LinkedList();
int anchor = 0;
for (int i = 0; i < nums.length; ++i) {
int t = nums[i];
if (i == nums.length - 1 || nums[i+1] != t) {
int count = i - anchor + 1;
if (prev != null && t - prev != 1) {
while (prevCount-- > 0)
if (prev < starts.poll() + 2)
return false;
prev = null;
}
if (prev == null || t - prev == 1) {
while (prevCount > count) {
prevCount--;
if (t - 1 < starts.poll() + 2)
return false;
}
while (prevCount++ < count)
starts.add(t);
}
prev = t;
prevCount = count;
anchor = i + 1;
}
}
while (prevCount-- > 0)
if (nums[nums.length - 1] < starts.poll() + 2)
return false;
return true;
}
}