每日一道Leetcode-904. 水果成篮【双指针|滑动窗口】

在这里插入图片描述在这里插入图片描述

class Solution {
    public int totalFruit(int[] tree) {
        // 只能选两种类型的水果
        // 保证这两种类型的果树最多
        // 看只有两种类型水果的一个区间中果树有多少
        // 遍历记录前一个水果类型和当前的水果类型,num>2记录一下区间?
        // 滑动窗口类型:使用双指针,遍历,不一样的数字如果大于2就结束,确定区间,计算其中的果树
        int ans = 0;
        int i = 0;
        // 定义Counter类,方便取和增加操作
        Counter count = new Counter();
        // 遍历数组
        for(int j = 0; j< tree.length;j++){
            // 插入树中元素,记录当前类型水果果树的个数
            count.add(tree[j],1);
            // 大于3的情况,移除前面的值,i往后滑动
            while(count.size()>=3){
                count.add(tree[i],-1);
                if(count.get(tree[i])==0){
                    count.remove(tree[i]);
                }
                i++;
            }
            // 如果不大于3的情况,看当前的最大的果树数目
            ans = Math.max(ans,j-i+1);
        }
        return ans;
    }
}
 // 定义一个类型,方便查操作
 class Counter extends HashMap<Integer,Integer>{
     public int get(int k){
         return containsKey(k) ? super.get(k) : 0;
     }
     public void add(int k,int v){
         put(k,get(k)+v);
     }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值