python窗口滑动算法_python3实现最滑动窗口最大值算法题——使用胜者树

题目

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

结果返回滑动窗口中的最大值。

示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3

输出: [3,3,5,5,6,7]

解释:

滑动窗口的位置     最大值

[1 3 -1] -3 5 3 6 7      3

1 [3 -1 -3] 5 3 6 7     3

1 3 [-1 -3 5] 3 6 7      5

1 3 -1 [-3 5 3] 6 7      5

1 3 -1 -3 [5 3 6] 7      6

1 3 -1 -3 5 [3 6 7]      7

提示:你可以假设k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。(但是在数组可以为空,这个时候k会等于0)(LeetCode都是骗人的233)

除了暴力遍历方法,可以通过存储滑动窗口的数据结构入手,使用堆或者双向队列存储滑动窗口内的值。这里选择堆(双向队列貌似更简单更快)。

"每次只找最大值"启发了我使用胜者树来解决问题。

胜者树与败者树

胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。

不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。

胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找

你可能感兴趣的:(python窗口滑动算法)