给你一个按 非递减顺序 排列的整数数组 nums 。
请你判断是否能在将 nums 分割成 一个或多个子序列 的同时满足下述 两个 条件:
每个子序列都是一个 连续递增序列(即,每个整数 恰好 比前一个整数大 1 )。
所有子序列的长度 至少 为 3 。
如果可以分割 nums 并满足上述条件,则返回 true ;否则,返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/split-array-into-consecutive-subsequences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.HashMap;
import java.util.Map;
class Solution {
public boolean isPossible(int[] nums) {
if (nums == null || nums.length < 3) {
return false;
}
Map<Integer, Integer> cntMap = new HashMap<>();
Map<Integer, Integer> endMap = new HashMap<>();
for (int num : nums) {
cntMap.put(num, cntMap.getOrDefault(num, 0) + 1);
}
for (int num : nums) {
int cnt = cntMap.getOrDefault(num, 0);
if (cnt > 0) {
int preEndCnt = endMap.getOrDefault(num - 1, 0);
if (preEndCnt > 0) {
cntMap.put(num, cnt - 1);
endMap.put(num, endMap.getOrDefault(num, 0) + 1);
endMap.put(num - 1, preEndCnt - 1);
} else {
int nxt1Cnt = cntMap.getOrDefault(num + 1, 0);
int nxt2Cnt = cntMap.getOrDefault(num + 2, 0);
if (nxt1Cnt != 0 && nxt2Cnt != 0) {
cntMap.put(num, cnt - 1);
cntMap.put(num + 1, nxt1Cnt - 1);
cntMap.put(num + 2, nxt2Cnt - 1);
endMap.put(num + 2, endMap.getOrDefault(num + 2, 0) + 1);
} else {
return false;
}
}
}
}
return true;
}
}
标签:nums,endMap,put,num,数组,cntMap,序列,getOrDefault,659
From: https://www.cnblogs.com/tianyiya/p/17238429.html