LeetCode_904_水果成蓝

题目链接

解题思路

  • 其实就是求只包含两种元素的最长连续子序列,使用双指针,最大滑动窗口法
  • 第一个篮子(左篮子)里面装的是慢指针代表的水果种类,第二个篮子(右篮子)代表快指针的水果种类
  • 1, 2, 3, 2, 2为例,当有新种类的水果进入窗口时,有三种情况:
    1. 如果窗口中只有一种水果,那么就将这种水果加入右篮子。
      • 当前窗口为1,现在进来2,则窗口更新为1, 2
    2. 如果已经有两种水果了,那么就更新慢指针,然后将左篮子子装较新的水果,右篮子装新水果
      • 当前窗口为1, 2,现在进来3, 则窗口更新为2, 3
    3. 如果这是已经出现在左右篮子中的水果,那么就更新一下右篮子的指针
      • 当前窗口为2, 3,现在进来2,则窗口更新为2, 3, 2
    4. 终止条件是没有新种类的水果进来,也就是快指针走到数组末端。最后选择最大的窗口长度,即为答案。

AC代码

class Solution {
    public int totalFruit(int[] fruits) {
        int slow = 0;
        int fast = 0;
        int ans = 0;
        int leftBasket = fruits[slow];
        int rightBasket = fruits[fast];
        for (fast = 0; fast < fruits.length; fast++) {
            if (fruits[fast] != leftBasket && fruits[fast] != rightBasket) {
                slow = fast - 1;
                leftBasket = fruits[slow];
                while (slow >= 1 && fruits[slow - 1] == leftBasket) {
                    slow--;
                }
                rightBasket = fruits[fast];
            }
            ans = Math.max(ans, fast - slow + 1);
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值