题目
本题具体内容见Leetcode-q904。
解题思路
先上个结果,这也太扯了。。。
该问题翻译成人话就是:求长度最大的、只包含两个数字的连续数组的长度。
一开始我是沿着双指针法的思路去做的:
每次循环,slow和fast都要在新的fruit1位置上,然后fast往后遍历,遍历步骤:
- fast先找到fruit2是谁;
- fast继续遍历,直到遇到fruit3,计算length,和max比较;
- slow和fast都赋值为fast-1.
上述做法有个非常明显的问题,那就是最后一步,更新slow的时候,这种双指针法,更新slow是在当前子数组的末尾,但是如果末尾是重复数组,如[0,1,6,6,4,4,6],当处理1,6,6这个子数组时,结束后,slow和fast被赋值到了3,然而实际上,应该赋值为6连续出现的第一个位置。而我们的slow和fast功能已经无法改动了,因此这里引入第三个指针,anchor,用于记录对每个子数组进行划窗分析的时候,下一个子数组应该开始的位置。
至于anchor的更新,应该遵循以下原则:
- 在一开始找fruit2的时候,一找到fruit2,就给anchor赋值为fast;
- 此后,一旦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