題目
你正在探訪一家農(nóng)場(chǎng),農(nóng)場(chǎng)從左到右種植了一排果樹。這些樹用一個(gè)整數(shù)數(shù)組 fruits 表示,其中 fruits[i] 是第 i 棵樹上的水果種類。
你想要盡可能多地收集水果。然而,農(nóng)場(chǎng)的主人設(shè)定了一些嚴(yán)格的規(guī)矩,你必須按照要求采摘水果:
- 你只有兩個(gè)籃子,并且每個(gè)籃子只能裝單一類型的水果。每個(gè)籃子能夠裝的水果總量沒有限制。
- 你可以選擇任意一棵樹開始采摘,你必須從每棵樹(包括開始采摘的樹)上恰好摘一個(gè)水果 。采摘的水果應(yīng)當(dāng)符合籃子中的水果類型。每采摘一次,你將會(huì)向右移動(dòng)到下一棵樹,并繼續(xù)采摘。
- 一旦你走到某棵樹前,但水果不符合籃子的水果類型,那么就必須停止采摘。
給你一個(gè)整數(shù)數(shù)組 fruits ,返回你可以收集的水果的最大數(shù)目。
方法:滑動(dòng)窗口
start:出現(xiàn)非前一種水果類型的新水果類型的位置
end:向右移動(dòng)
result:返回的水果數(shù)量
types:水果信息的字典({水果類型:數(shù)量,...})
- 若此時(shí) types 中存在兩種水果且此位置的水果并非前兩種水果,那么 end 將回到最后一次出現(xiàn)不同水果的位置(即在這個(gè)數(shù)列中此位置之后的所有水果均與此水果種類相同)。
- 若此時(shí) types 中不存在任何水果或只存在一種水果或者此位置的水果為前兩種水果之一,那么此種水果的 value 將加一,并且若此水果在 types 中并不存在, 那么 start 將記錄此位置,之后 end 繼續(xù)向右移動(dòng)。
class Solution(object):
def totalFruit(self, fruits):
start = end = 0
result = 0
types = {}
while end < len(fruits):
if len(types) == 2 and types.get(fruits[end]) is None:
end = start
types = {}
else:
types[fruits[end]] = types.get(fruits[end], 0) + 1
if fruits[end] != fruits[start]:
start = end
end = end + 1
result = max(result, sum(types.values()))
return result
相關(guān)知識(shí)
-
字典:
dict = {key1: value1, key2: value2,...}
get(key, default = None):dict.get()
返回指定鍵的值,若此指定鍵不存在,那么返回默認(rèn)值。
values():dict.values()
返回所有的值
報(bào)錯(cuò)
-
TypeError: get() takes no keyword arguments
types[fruits[end]] = types.get(fruits[end], default = 0) + 1
default 并非內(nèi)置參數(shù)不能直接使用,除去即可