904. 水果成篮

保持不变的就是水果种类要保持两种

放水果时(也就是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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值