[英雄星球七月集训LeetCode解题日报] 第6日 滑动窗口

日报

  • 第二题不太会做,看了题解,dp做的。

题目

一、 643. 子数组最大平均数 I

链接: 643. 子数组最大平均数 I

1. 题目描述

在这里插入图片描述

2. 思路分析
  • 求最大和的滑窗,最后除以K即可。
3. 代码实现
class Solution:
    def findMaxAverage(self, nums: List[int], k: int) -> float:
        n = len(nums)
        ans = -inf
        j = 0
        s = 0
        for i in range(n-k+1):
            while j<n and j-i+1 <= k:
                s += nums[j]
                j += 1
            ans = max(ans,s)
            # print(nums[i:j],s,k,s/k)
            s -= nums[i]
        return ans/k

二、 718. 最长重复子数组

链接: 718. 最长重复子数组

1. 题目描述

在这里插入图片描述

2. 思路分析
  • dp[i][j] 表示nums[:i+1] 和nums[:j+1]的最长公共后缀
  • 显然n1[i] == n2[j] 则dp[i][j] = dp[i-1][j-1] + 1
3. 代码实现
class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        m,n = len(nums1),len(nums2)
        dp = [[0]*n for _ in range(m)]
        # dp[i][j] 表示nums[:i+1] 和nums[:j+1]的最长公共后缀
        # 显然n1[i] == n2[j] 则dp[i][j] = dp[i-1][j-1] + 1
        if nums1[0] == nums2[0]:
            dp[0][0] = 1
        for i in range(m):
            if nums1[i] == nums2[0]:
                dp[i][0] = 1
        for j in range(n):
            if nums2[j] == nums1[0]:
                dp[0][j] = 1
        for i in range(1,m):
            for j in range(1,n):
                if nums1[i] == nums2[j]:
                    dp[i][j]  = dp[i-1][j-1] + 1
        return max(max(row) for row in dp)

三、 978. 最长湍流子数组

链接: 978. 最长湍流子数组

1. 题目描述

在这里插入图片描述

2. 思路分析
  • 观察样例可知,只有摆动子区间才符合题意。
  • 那我们计算出差分数组,两数差<0记-1,>0记1,==0记0。
  • 只有交替出现的1和-1才能让数字增长。
  • 题目可以转化为求差分数组c[]摆动区间的长度,最后+1即可。
  • 令dp[i]为差分数组以i为结尾的最长摆动长度。
  • 显然只有c[i]=-c[i-1]时,dp[i]=dp[i-1]+1
  • 如果c[i] == 0,dp[i] = 0;否则=1
  • 别忘了最后+1
3. 代码实现
class Solution:
    def maxTurbulenceSize(self, arr: List[int]) -> int:
        if len(arr)<2:
            return len(arr)
        t = [(a-b)//abs(a-b) if a-b!=0 else 0 for a,b in pairwise(arr)]
        # print(t)
        n = len(t)
        dp = [1] * n 
        if t[0] == 0:
            dp[0] = 0
        for i in range(1,n):
            if t[i] == -t[i-1]:
                dp[i] = dp[i-1] + 1
            if t[i] == 0:
                dp[i] = 0
        return max(dp) + 1

四、 1052. 爱生气的书店老板

链接: 1052. 爱生气的书店老板

1. 题目描述

在这里插入图片描述

2. 思路分析

这题之前做过了。

  • 先计算本来能有多少顾客满意s。
  • 不断移动滑窗,计算在每个窗口内,老板能让多少不满意的顾客改变想法,change,求这个最大的change。
  • 最后加起来即可s+change。
3. 代码实现
class Solution:
    def maxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int:
        n = len(customers)
        s = sum(customers[i]*(grumpy[i]^1) for i in range(n))
        max_change = change = sum(customers[i]*grumpy[i] for i in range(minutes))
        
        for r in range(minutes, n):
            l = r - minutes             
            change += customers[r]*grumpy[r] - customers[l]*grumpy[l]
            max_change = max(max_change, change)
        
        return s + max_change
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值