JAVA_滑动窗口_水果成篮

题目:

解析:

        题目简介:一个树上有多种水果,当我们只能取其中连续并且长度最长的两种水果。

       先定义左右指针将他们指向数组的0下标,让right先走,同时用哈希表记录走过的水果种类,如果种类超过2的话,就让left走一步,如果left指向位置的水果种类的数量为0,那么就从哈希表中移除该水果,直到right走向数组的最后,放回right和left的相差距离即可。

代码:

代码1(哈希表):

public int totalFruit(int[] fruits) {
        Map<Integer,Integer> hashMap=new HashMap<Integer,Integer>();
        int ret=0;
        for(int left=0,right=0;right<fruits.length;right++){
            int in=fruits[right];
            hashMap.put(in,hashMap.getOrDefault(in,0)+1);
            while(hashMap.size()>2){
                int out=fruits[left];
                hashMap.put(out,hashMap.get(out)-1);
                if(hashMap.get(out)==0){
                    hashMap.remove(out);
                }
                left++;
            }        
            ret=Math.max(ret,right-left+1);
        }
        return ret;
    }

代码2(数组模拟哈希表);

    public int totalFruit(int[] fruits) {
        int [] hashMap=new int[fruits.length+1];
        int ret=0;
        int kind=0;
        for(int left=0,right=0;right<fruits.length;right++){
            int in=fruits[right];
            if(hashMap[in]==0) kind++;
            hashMap[in]++;
            while(kind>2){
                int out=fruits[left];
                hashMap[out]--;
                if(hashMap[out]==0) kind--;
                left++;
            }        
            ret=Math.max(ret,right-left+1);
        }
        return ret;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值