直通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在内且在其中的每一颗子树上,值最大的结点都是树的头

你可能感兴趣的:(直通BAT)