剑指offer59:队列的最大值

题目1:滑动窗口的最大值

#方法1:暴力法+双指针
def maxInWindows(num, size):
    if not num:
        return None
    if size==1:
        return num
    if size>len(num):
        return max(num)
    left=0
    right=2
    re=[]
    while left<right:
        re.append(max(num[left:right+1]))
        left  += 1
        right += 1
        if right==len(num):
            break
    return re
    
    
num=[2,3,4,2,6,2,5,1]
size=3
maxInWindows(num,size)

#方法2:滑动窗口

def maxInWindows(num, size):
    #如果数组不存在,则返回[]
    if not num:
        return []
    #如果滑动窗口的大小》数组的大小,或者size<0,则返回[]
    if size> len(num) or size<1:
        return []
    if size==1:
        return num
    #存放可能是最大值的下标,和存放输出结果数组的初始化
    maxdeque=[]
    res=[]
    n=len(num)
    for i in range(n):
        #判断队首下标对应的元素是否已经退出窗口
        if i>=size and maxdeque[0]<=i-size:
            maxdeque.pop(0)
        #将第i个元素与maxdeque中的值比较,将小于i的值pop
        while maxdeque and num[i]>num[maxdeque[-1]]:
            maxdeque.pop()
        #如果现在maxdeque长度没达到size规模,元素压入
        maxdeque.append(i)
        #每个完整的窗口保存当前最大值
        if i>=size-1:
            res.append(num[maxdeque[0]])
    return res
        
    

    
    
num=[2,3,4,2,6,2,5,1]
size=3
maxInWindows(num,size)
发布了86 篇原创文章 · 获赞 1 · 访问量 8241

猜你喜欢

转载自blog.csdn.net/a1272899331/article/details/104288551