leetcode 659. 分割数组为连续子序列

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值