【Leetcode刷题】q904-水果成篮(用三个指针来解决)

题目

在这里插入图片描述
本题具体内容见Leetcode-q904

解题思路

先上个结果,这也太扯了。。。
image.png

该问题翻译成人话就是:求长度最大的、只包含两个数字的连续数组的长度。
一开始我是沿着双指针法的思路去做的:
每次循环,slow和fast都要在新的fruit1位置上,然后fast往后遍历,遍历步骤:

  1. fast先找到fruit2是谁;
  2. fast继续遍历,直到遇到fruit3,计算length,和max比较;
  3. slow和fast都赋值为fast-1.

上述做法有个非常明显的问题,那就是最后一步,更新slow的时候,这种双指针法,更新slow是在当前子数组的末尾,但是如果末尾是重复数组,如[0,1,6,6,4,4,6],当处理1,6,6这个子数组时,结束后,slow和fast被赋值到了3,然而实际上,应该赋值为6连续出现的第一个位置。而我们的slow和fast功能已经无法改动了,因此这里引入第三个指针,anchor,用于记录对每个子数组进行划窗分析的时候,下一个子数组应该开始的位置。

至于anchor的更新,应该遵循以下原则:

  1. 在一开始找fruit2的时候,一找到fruit2,就给anchor赋值为fast;
  2. 此后,一旦fast和fast-1不相等,就给anchor重新赋值为fast(主要是避免1,6,1,6,1,6这种情况)。

至此,上述问题就解决了。

代码

class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        slow = 0
        fast = 0
        max_fruit_num = 0
        while(fast < len(fruits)):
            fruit1 = fruits[slow]
            while(fruits[fast] == fruit1):
                fast += 1
                if fast >= len(fruits):
                    break
            anchor = fast
            if fast == len(fruits):
                return max(max_fruit_num, fast - slow)
            else:
                fruit2 = fruits[fast]
                while(fruits[fast] == fruit1 or fruits[fast] == fruit2):
                    fast += 1
                    if fast >= len(fruits):
                        break
                    if (fruits[fast] == fruit1 or fruits[fast] == fruit2) and fruits[fast] != fruits[fast - 1]:
                        anchor = fast
                max_fruit_num = max(max_fruit_num, fast - slow)
                if anchor == len(fruits) - 1:
                    break
                slow = anchor
                fast = slow
        return max_fruit_num
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值