直通BAT面试算法精讲--栈和队列(3)

案例五

滑动窗口练习题
题干:
有一个整形数组arr和一个大小为w的窗口,从数组的最左边滑到最右边,窗口每次向右滑一个位置,返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值,以数组为[4,3,5,4,3,3,6,7],w=3为例,因为第一个窗口[4,3,5]的最大值为5,第二个窗口[3,5,4]的最大值为5,第三个窗口[5,4,3]的最大值为5,第四个窗口[4,3,3]的最大值为4,第五个窗口[3,3,6]的最大值为6,第六个窗口[3,6,7]的最大值为7,所以最终返回[5,5,5,4,6,7]

解题思路:
用队列的思想实现

class Solution():
    def sliding_window(self,arr,w):
        n = len(arr)
        res = []
        if n<=0:
            return 
        for i in range(n-w+1):
            res.append(max(arr[i:i+w]))
        return res

案例7

数组变树练习题
题干:
给定一个没有重复元素的数组arr,写出生成这个数组的MaxTree的函数
要求如果数组长度为N,则时间复杂度为O(n),额外空间复杂度为O(n)

MaxTree的概念如下:
1.MaxTree是一颗二叉树,数组的每一个值对应一个二叉树结点
2.包括MaxTree在内且在其中的每一颗子树上,值最大的结点都是树的头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值