659. 分割数组为连续子序列
这个题目利用贪心和hash来解决
贪心是保证所获得的序列能够长,hash用来快速判断和获得该数字的信息
对于一个数字val,首先应该判断它是否能够接到一个序列当中(贪心),若不能够接入,则判断其能否生成一个最小长度为3的序列。若两种方式都不能满足,那么就下结论,存在一个不能生成要求的序列。最后若遍历完,则返回true
class Solution {
public boolean isPossible(int[] nums) {
//两个map分别记录着数字对应的个数,以这个数字结尾的序列的个数
Map<Integer, Integer> numCount = new HashMap<>();
Map<Integer, Integer> endNum = new HashMap<>();
//统计每个数字对应的个数
for(Integer val : nums){
if(numCount.containsKey(val)){
numCount.put(val, numCount.get(val)+1);
}else{
numCount.put(val, 1);
}
}
//遍历整个数组进行判断
for(Integer val : nums){
//如果对应的数字的个数为0(可能被提前消耗),则跳过
if(numCount.get(val)==0){
continue;
}
//对这个数字的个数-1(消耗了一个)(进入序列)
numCount.put(val, numCount.get(val)-1);
//首先判断是否有以val-1结尾的序列(是否有,且没有被消耗)
if(endNum.containsKey(val-1)&&endNum.get(val-1)>0){
//连接上后val-1 消耗一个, val结尾的增加一个
endNum.put(val-1, endNum.get(val-1)-1);
if(endNum.containsKey(val)){
endNum.put(val, endNum.get(val)+1);
}else{
endNum.put(val,1);
}
}//有val+1和val+2,那么将其加入队列
else if(numCount.containsKey(val+1)&&numCount.get(val+1)>0&&numCount.containsKey(val+2)&&numCount.get(val+2)>0){
numCount.put(val+1, numCount.get(val+1)-1);
numCount.put(val+2, numCount.get(val+2)-1);
if(endNum.containsKey(val+2)){
endNum.put(val+2, endNum.get(val+2)+1);
}else{
endNum.put(val+2,1);
}
}else{
return false;
}
}
return true;
}
}