904. 水果成篮_滑动窗口
思路:
用一个滑动窗口,从窗口起始位置开始遍历,前两类存入一个列表中,当遇到同类的就直接往后移动直至碰到窗口结束,遇到不同类,即第三类就更换窗口。
窗口有两种情况需要滑动:

  • 当窗口碰到数组结尾处 窗口大小就是答案 也就是说该情况下整个数组只有两类数字
  • 当遇到第三类,需要更换窗口,此时答案为j-i 不包含当前窗口末尾元素
class Solution:
def totalFruit(self, fruits: List[int]) -> int:
'''
思路:滑动窗口 窗口从起始元素开始,将遇到的前两种类型的水果加入到一个列表中,如果窗口包含的种类不属于这个列表,那么就可以退出了。窗口的长度就是该题的解.
'''
res = -1
i,j= 0,0 # i是窗口起始位置 j是窗口结束位置
lis = [] # 存放两种水果种类
while j < len(fruits):
if fruits[j] not in lis and len(lis) !=2:
lis.append(fruits[j])
j += 1
continue
if fruits[j] in lis:
if j == len(fruits)-1:
res = max(res,j-i+1) # 如果是遍历到了末尾,那么就是窗口大小为答案
break
else:
j += 1
continue
# 窗口位置改变的条件:要么窗口结束位置到了数组末尾 要么碰到了第三类(窗口大小-1为答案)
res = max(res,j-i)
lis = [] # 种类清空
i += 1 # 窗口往前移动
j = i # 从当前位置滑动窗口
return res

但是比较遗憾的是测试用例没有过【0】 仔细调整一下,将返回的结果直接改为max(res,j-1)即可 这种情况也就是有一类的意思。

class Solution:
def totalFruit(self, fruits: List[int]) -> int:
'''
思路:滑动窗口 窗口从起始元素开始,将遇到的前两种类型的水果加入到一个列表中,如果窗口包含的种类不属于这个列表,那么就可以退出了。窗口的长度就是该题的解.
'''
res = -1
i,j= 0,0 # i是窗口起始位置 j是窗口结束位置
lis = [] # 存放两种水果种类
while j < len(fruits):
if fruits[j] not in lis and len(lis) !=2:
lis.append(fruits[j])
j += 1
continue
if fruits[j] in lis:
if j == len(fruits)-1:
res = max(res,j-i+1) # 如果是遍历到了末尾,那么就是窗口大小为答案
break
else:
j += 1
continue
# 窗口位置改变的条件:要么窗口结束位置到了数组末尾 要么碰到了第三类(窗口大小-1为答案)
res = max(res,j-i)
lis = [] # 种类清空
i += 1 # 窗口往前移动
j = i # 从当前位置滑动窗口
return max(res,j-i)

最终AC 收工睡觉。