需要注意题目的描述有问题,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;
}
}