每日一道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);
     }
 }

猜你喜欢

转载自blog.csdn.net/weixin_41041275/article/details/111355057