力扣 904. 水果成篮

78 阅读1分钟

image.png

image.png

需要注意题目的描述有问题,fruits[i]是第i棵树上水果的的种类的代号,一棵树上只有一种水果,不要理解成一棵树上有多种水果。

题目的意思说的很不明白,换成正常人说的话是:在一个数组中找出只包含不多于两种水果的最长连续子数组。

采用HashMap保存每次遍历到的水果种类和它出现的次数,然后判断篮子里的水果种类是否超过2种,如果超过2种,就把这个多余的水果种类逐渐减少1,当这个多余的水果种类减到0,删除它。这样做可以刚好保留新的水果种类和它前面的一个水果种类。

class Solution {
    public int totalFruit(int[] fruits) {
        int i=0, j=0, result=0;
        HashMap<Integer,Integer> mymap = new HashMap<>();
        for(; j<fruits.length; j++){
            mymap.put(fruits[j], mymap.getOrDefault(fruits[j], 0)+1);
            while(mymap.size()>2){
                mymap.put(fruits[i], mymap.getOrDefault(fruits[i], 0)-1);
                if(mymap.get(fruits[i])==0){
                    mymap.remove(fruits[i]);
                }
                i++;
            }
            result=Math.max(result, j-i+1);
        }
        return result;
    }
}