力扣刷题 day28:09-27

1.水果成篮

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。力扣刷题 day28:09-27_第1张图片

方法一:滑动窗口 

#方法一:滑动窗口
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

2.和相同的二元子数组 

给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。

子数组 是数组的一段连续部分。力扣刷题 day28:09-27_第2张图片

方法一:前缀和+哈希表 

#方法一:前缀和+哈希表
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

3.最长湍流子数组 

给定一个整数数组 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]。力扣刷题 day28:09-27_第3张图片

方法一:动态规划 

#方法一:动态规划
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

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展)