剑指offer实践 ——59.1.和为s的连续正数序列(python版)



题目

滑动窗口的最大值
在这里插入图片描述


一、双指针

使用两个指针分别之乡滑动窗口的头部和尾部,求出最大值放入res后移动两个指针~

def max_value_1(arr, k):
    if not arr or k <= 0 or k > len(arr):
        return []

    res = [0] * (len(arr) - k + 1)
    res_index = 0

    i, j = 0, k
    while j <= len(arr):
        res[res_index] = max(arr[i:j])

        i += 1
        j += 1
        res_index += 1
    return res

在这里插入图片描述

二、队列记录滑动窗口

比较直接的思路是一种设置两个指针,每次比较两个指针之间的数字,取max
这种在窗口较小的情况下,也比较高效。但是如果窗口很长,仍旧每次都要比较所有的数字,就十分不划算。
此时,我们借助一个队列,来存放当前窗口的数字。
例如:[2,-1,4,3,2,5,4], 窗口=3
1.初始化一个队列,放入第一个窗口的数字,并判断出第一个窗口的最大值,放入res
在这里插入图片描述
2.进入循环
在这里插入图片描述

a.队首元素出队(2出队)
b.新元素入队(3入队)
c.比较出队的元素2 是否是上一个滑动窗口的最大值
d.出队元素是上一个滑动窗口的最大值,比较队列(即当前滑动窗口)所有元素获取最大值;出队元素不是上一个窗口的最大值,比较上一个窗口的最大值与当前元素
e.放入res

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def max_value(arr, k):
    if not arr or k <= 0 or k > len(arr):
        return []

    res = arr[:len(arr)-k+1]

    queue = arr[:k]
    res[0] = max(queue)
    res_index = 1

    for i in range(k, len(arr)):
        drop = queue.pop(0)
        queue.append(arr[i])

        if drop == res[res_index-1]:
            res[res_index] = max(queue)
        else:
            res[res_index] = max(res[res_index-1], arr[i])
        res_index += 1
        
    return res

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值