你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。
你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:
你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。
#方法一:滑动窗口
def totalFruit(fruits):
left=0
res,dic=0,{}
for right in range(len(fruits)):
if fruits[right] not in dic:
dic[fruits[right]]=1
else:
dic[fruits[right]]+=1
while len(dic)>2: #判断当前水果种类数目
dic[fruits[left]]-=1
if dic[fruits[left]] == 0:
dic.pop(fruits[left]) #不含有该种类就删去
left+=1 #找到下一个起始点
res=max(res,right-left+1)
return res
给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。
#方法一:前缀和+哈希表
def numSubarraysWithSum(nums,goal):
presum=[0 for i in range(len(nums)+1)] #构建前缀和数组
dic,res={0:1},0
for i in range(1,len(nums)+1):
presum[i]=presum[i-1]+nums[i-1] #前缀和数组
for i in range(1,len(nums) +1):
tem=presum[i]-goal #获得需要的前缀和大小
if tem in dic:
res+=dic[tem] #tem出现的次数即为可能的结果数目
if presum[i] not in dic:
dic[presum[i]]=1 #记录当前前缀和出现的次数
else:
dic[presum[i]]+=1
return res
给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。
更正式地来说,当 arr 的子数组 A[i], A[i+1], ..., A[j] 满足仅满足下列条件时,我们称其为湍流子数组:
若 i <= k < j :
当 k 为奇数时, A[k] > A[k+1],且
当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j :
当 k 为偶数时,A[k] > A[k+1] ,且
当 k 为奇数时, A[k] < A[k+1]。
#方法一:动态规划
def maxTurbulenceSize(arr):
up=[1 for i in range(len(arr))] #up[i]表示以i结尾时候的增长时最长湍流子数组长度
down=[1 for i in range(len(arr))] #down[i] 表示以i结尾时候降低时候最长湍流子数组长度
res=1
for i in range(1,len(arr)):
if arr[i]>arr[i-1]:
up[i]=down[i-1]+1 #增长时候的等于减少时候最长加1
down[i]=1 #这个时候降低的就变成了本身长度1
elif arr[i]
方法二:滑动窗口
#方法二:滑动窗口
def maxTurbulenceSize(arr):
left,right,res=0,0,1
while right arr[right + 1] and arr[right] > arr[right - 1]:
right+=1
else:
left=right #不满足题意,左指针移动到右指针
res=max(res,right-left+1) #[left,right+1] 之间的数
return res