水果成篮,双指针图文并茂LeetCode_904

题目信息

示例 1:

输入:[1,2,1]
输出:3
解释:我们可以收集 [1,2,1]。

示例 2:

输入:[0,1,2,2]
输出:3
解释:我们可以收集 [1,2,2]
如果我们从第一棵树开始,我们将只能收集到 [0, 1]。

示例 3:

输入:[1,2,3,2,2]
输出:4
解释:我们可以收集 [2,3,2,2]
如果我们从第一棵树开始,我们将只能收集到 [1, 2]。

示例 4:

输入:[3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:我们可以收集 [1,2,1,1,2]
如果我们从第一棵树或第八棵树开始,我们将只能收集到 4 棵水果树。

解析: 定义双指针i,j。创建一个哈希表统计每种水果的收集的数量,res为答案。i指针遍历fruits数组,并将当前i下标的值放到哈希表中,如果哈希表的长度大于2了。这时候判断j下标哈希表的value是不是1,如果是1的话说明j下标的值没有尽可能的存放多的水果数量。不是最优解。就在哈希表中删除它。如果不是1,就把当前j下标的值放到哈希表中,value是j下标自己的value-1.跳出while循环后j指针向后移动一位。并更新res、

代码实现:

public int totalFruit(int[] fruits) {
          
   
        //记录答案
        int res=0;
        //哈希表统计每种水果数量
        HashMap<Integer,Integer> map=new HashMap<> ();
        for(int i=0,j=0;i<fruits.length;i++){
          
   
            //将当前i下标的水果放到map中,统计次数
            map.put (fruits[i],map.getOrDefault (fruits[i],0)+1);
            //当map的size大于2了,就说明需要检查答案是否是最优解
            while (map.size ()>2){
          
   
                //因为要尽可能的在两种水果里多放一些就要检查j的数量是不是太少了。少了就剔除
                if(map.get (fruits[j])==1){
          
   
                    map.remove (fruits[j]);
                }else {
          
   
                    map.put (fruits[j],map.get (fruits[j])-1);
                }
                j++;
            }
            //更新答案
            res=Math.max (res,i-j+1);
        }
        return  res;
    }
经验分享 程序员 微信小程序 职场和发展