保持不变的就是水果种类要保持两种
放水果时(也就是i指针移动的过程):如果之前没有此种类的的水果( 对应的 basket[ fruits[ i ] ] == 1 )
那就让水果种类sum加一.i
扔水果时(也就是j指针移动的过程):如果某类水果全扔完了( 对应的 basket[ fruits[ j ] ] == 0 )
那就让水果种类sum减一.
每一次for循环结束时,也就是每一次水果种类为两种时,
取两个篮子中水果的个数 ( i - j + 1 )进行比较,留下较大的数值,就是最多能采摘的个数!!!
要注意对应j++的位置是位于while循环的结束
class Solution {
public int totalFruit(int[] fruits) {
int n = fruits.length;
int[] basket = new int[n];//水果篮子,里面存放位置对应着水果的种类
int sum = 0;//采摘水果的种类
int ans = 0;//可以收集水果的最大数量,也就是答案.
for(int i = 0,j = 0;i<n;i++){
basket[fruits[i]]++;// 向虚拟篮子中放入对应种类的一个水果
if(basket[fruits[i]] == 1){//放入之后,如果此篮子只有一个,
sum++; //那么我们就将收集的水果种类加一
}
while(sum>2){ //当我们收集到超过两种以上的水果之后
basket[fruits[j]]--; //返回j,将最一开始收集到的水果扔掉一个
if(basket[fruits[j]]==0){ //如果之前收集的水果种类有一种全部没有了
sum--; //我们就将水果种类减少一种
}
j++; //依次 查看
}
ans = Math.max(ans, i - j + 1);
}
return ans;
}
}