滑动窗口--模板

# 滑动窗口类型题目,模板如下
class Solution: 
    def problemName(self, s: str) -> int: 
        # Step 1: 定义需要维护的变量们 (对于滑动窗口类题目,这些变量通常是最小长度,最大长度,或者哈希表) 
        # 字符串大小字串包含、字符(无)重复等 -- 哈希表(1哈希表是否相等 2哈希表value是否满足条件)
        # 最大小 -- 累加和
        x, y = ..., ... 

        # Step 2: 定义窗口的首尾端 (start, end), 然后滑动窗口 
        start = 0 
        for end in range(len(s)): 

        # Step 3: 更新需要维护的变量, 有的变量需要一个if语句来维护 (比如最大最小长度) 
        x = new_x 
        if condition: 
            y = new_y 

        ''' ------------- 下面是两种情况,读者请根据题意二选1 ------------- ''' 
        # Step 4 - 情况1 # 如果题目的窗口长度固定:用一个if语句判断一下当前窗口长度是否达到了限定长度 end-start+1 >= len(p)  一般是大于等于
        # 如果达到了,窗口左指针前移一个单位,从而保证下一次右指针右移时,窗口长度保持不变, 
        # 左指针移动之前, 先更新Step 1定义的(部分或所有)维护变量 if 窗口长度达到了限定长度: 
        # 更新 (部分或所有) 维护变量 
        # 窗口左指针前移一个单位保证下一次右指针右移时窗口长度保持不变 

        # Step 4 - 情况2 # 如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题 
        # 如果当前窗口不合法时, 用一个while去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法 
        # 在左指针移动之前更新Step 1定义的(部分或所有)维护变量 while 不合法: 
        # 更新 (部分或所有) 维护变量 # 不断移动窗口左指针直到窗口再次合法 

        # Step 5: 返回答案 
        return ...

例题  438. 找到字符串中所有字母异位词

class Solution(object):
    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """
        #1 定义变量,变量包括:结果,从已知到结果的中间值
        res, hashmap,p_hashmap = [], {}, {}
        for i in p:
            p_hashmap[i] = p_hashmap.get(i,0) + 1
        #2 定义头尾指针
        start = 0
        for end in range(len(s)):
        # 3 更新变量,中间变量,
        #   if判断满足规定条件,更新结果
            hashmap[s[end]] = hashmap.get(s[end],0) + 1
            if hashmap == p_hashmap:
                res.append(start)
        # 4 if判断窗口长度是否等于规定值,while判断条件是否满足,移动指针,
        #   先更新因为指针移动而产生变化的变量
        #   if判断固定长度,是大于等于,end-start+1 >= len(p) 等于的时候也要变化
            if end-start+1 >= len(p):
                hashmap[s[start]] -= 1
                if hashmap[s[start]]==0:
                    del hashmap[s[start]]
                start += 1
        # 5 返回结果
        return res

1052. 爱生气的书店老板

import numpy as np
# leetcode submit region begin(Prohibit modification and deletion)
class Solution(object):
    def maxSatisfied(self, customers, grumpy, minutes):
        """
        :type customers: List[int]
        :type grumpy: List[int]
        :type minutes: int
        :rtype: int
        """
        arr_cus = np.array(customers)
        arr_gru = np.array(grumpy)
        arr_min = np.ones(minutes)
        sum_org = np.sum(arr_cus*arr_gru)
        cost = 0
        start = 0
        for end in range(len(grumpy)):
            if end-start+1 >= minutes:
                min_sum_son = np.sum(arr_cus[start : end+1] * arr_min)
                org_sum_son = np.sum(arr_cus[start : end+1] * arr_gru[start : end+1])
                cost_temp = sum_org + min_sum_son - org_sum_son
                cost = max(cost_temp, cost)
                start += 1
            else:
                cost = sum_org
        return int(cost)

customers = [1]
grumpy = [0]
minutes = 1
# 输出:16
# 解释:书店老板在最后 3 分钟保持冷静。
# 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
test = Solution()
res = test.maxSatisfied(customers,grumpy,minutes)
print(res)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值