单调队列
package main
/**
*
* @param num int整型一维数组
* @param size int整型
* @return int整型一维数组
*/
func maxInWindows(num []int, size int) []int {
// write code here
l := len(num)
if l == 0 || size == 0 || size > l {
return nil
}
// 返回的结果集
res := make([]int, 0)
// 单调队列
// 从大到小排序
list := make([]int, 0)
// 窗口右移,判断单调队列第一个元素是否等于被移除的元素值
// 等于被移除的元素值,则单调队列第一个元素也移除
pop := func(val int) {
if list[0] == val {
list = list[1:]
}
}
// 向单调队列压入一个数据
// 单调队列: 大于等于左边元素 小于等于右边元素
push := func(val int) {
for len(list) != 0 && list[len(list)-1] < val {
list = list[:len(list)-1]
}
list = append(list, val)
}
// 前size个元素进入单调队列
for i := 0; i < size; i++ {
push(num[i])
}
// 前size个元素为第一个窗口,取第一个窗口最大值
res = append(res, list[0])
// 处理后续元素
for i := size; i < len(num); i++ {
// 处理窗口左侧被移除的元素,判断是否也需要从单调队列移除
pop(num[i-size])
// 添加当前窗口右侧新增的元素
push(num[i])
// 取单调队列最大的元素值
res = append(res, list[0])
}
return res
}
京公网安备 11010502036488号