letcode每日一题- 分割数组为连续子序列
题目描述如下:
对于数组中的元素 x,如果存在一个子序列以 x-1 结尾,则可以将 x加入该子序列中。将 x 加入已有的子序列总是比新建
一个只包含 x 的子序列更优,因为前者可以将一个已有的子序列的长度增加 1,而后者新建一个长度为 1 的子序列,而题
目要求分割成的子序列的长度都不小于 3,因此应该尽量避免新建短的子序列。
基于此,可以通过贪心的方法判断是否可以完成分割。
使用两个哈希表,第一个哈希表存储数组中的每个数字的剩余次数,第二个哈希表存储数组中的每个数字作为结尾的子序列
的数量。
代码实现如下:
public boolean isPossible(int[] nums) {
Map<Integer, Integer> numMap = new HashMap<>();
Map<Integer, Integer> endMap = new HashMap<>();
for (int x : nums) {
//统计出现次数
numMap.put(x, numMap.getOrDefault(x, 0) + 1);
}
for (int x : nums) {
int count = numMap.getOrDefault(x, 0);
if (count > 0) {
int prevEndCount = endMap.getOrDefault(x - 1, 0);
if (prevEndCount > 0) {
//并入老队列
numMap.put(x, count - 1);
endMap.put(x - 1, prevEndCount - 1);
endMap.put(x, endMap.getOrDefault(x, 0) + 1);
} else {
//创建新队列
int count1 = numMap.getOrDefault(x + 1, 0);
int count2 = numMap.getOrDefault(x + 2, 0);
if (count1 > 0 && count2 > 0) {
numMap.put(x, count - 1);
numMap.put(x + 1, count1 - 1);
numMap.put(x + 2, count2 - 1);
endMap.put(x + 2, endMap.getOrDefault(x + 2, 0) + 1);
} else {
return false;
}
}
}
}
return true;
}