牛客网: BM45
题目: 数组num, 窗口大小size, 所有窗口内的最大值
思路: 用队列作为窗口,窗口内存储数组坐标,left = window[0], right从数组0开始遍历完数组,每次新增元素时,(1)先对窗口大小进行收缩到size大小范围,即right-left>=0时,left右移,即window弹出window[0],直到符合size范围;(2)对window从右侧开始所有比right坐标小的元素全部弹出window,最后将right处元素入队,此时以right为右端的窗口内的最大值即为num[window[0]];以此规律处理完num的所有元素。
注意: window进行收缩时要注意len(window)>0
代码:
// go
package main
// import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型一维数组
* @param size int整型
* @return int整型一维数组
*/
func maxInWindows( num []int , size int ) []int {
// write code here
if len(num) < size || size == 0 || len(num) == 0 {
return []int{}
}
res := []int{}
window := []int{}
for i := 0; i < size; i++ {
for len(window) > 0 && num[window[len(window)-1]] < num[i] {
window = window[:len(window)-1]
}
window = append(window, i)
}
res = append(res, num[window[0]])
for i := size; i < len(num); i++ {
for len(window)>0 && i - window[0] >= size {
window = window[1:]
}
for len(window) > 0 && num[window[len(window)-1]] < num[i] {
window = window[:len(window)-1]
}
window = append(window, i)
res = append(res, num[window[0]])
}
return res
}