leetcode 394
题目:
http://car.bitauto.com/chexingduibi/?carIDs=122844,123821
904 水果篮问题
抽象问题 :找出连续的只包含两个字母的最长子序列
思想:滑动协议,双指针遍历思想
key point:
- dic.setdefault(key)以及a=dict.defaultdict(list)/a=defaultdict(list)的区别
https://foofish.net/setdefault-defaultdict.html
dict.setdefault()来设置默认值(有建则返回值(类似于get)没建则创建新键 值按照默认参数设置) - a=defaultdict(list)(from collections import defaultdict)产生字典的函数,默认值初始化值为list对象
- 易错点:while嵌套循环注意里面循环条件满足才能跳出去
class Solution(object):
def totalFruit(self, tree):
“”"
:type tree: List[int]
:rtype: int
“”"
left, right = 0, 0 #左右指针指向0 右指针遍历,左指针控制条件移动(川酷移动)
res = 0 #记录最优结果(包括合格元素序列数目的最大值 即果实数量)
cnt = collections.defaultdict(int) #初始默认值为int 0的字典创建存储 以元素种类为键 值为元素数目
while right < len(tree): #第一个循环 右指针遍历
cnt[tree[right]] += 1 #右指针对应元素为键的值加一(若没有则初始化你为0=1有则直接加1)
while len(cnt) > 2: #第二个循环 控制左指针 元素种类超过2 则一直在此循环移动左指针直到只有两种元素
cnt[tree[left]] -= 1 #左指针对应元素的值-1 左指针移动
if cnt[tree[left]] == 0: #若值不为1 则一直循环减到0 然后删除该元素
del cnt[tree[left]]
left += 1 #第二个循环结束前左指针移动
res = max(res, right - left + 1) #计算合格区间的元素数 保存最大值
right += 1 的一个循环结束右指针移动
return res