//封装一个单调队列 //push的思路:如果窗口加入的值大于队列的back 也就是右侧左小值,那就把back删掉,直到等于小于或者队列长度为0,然后把这个值加进去 //pop的思路:就是看窗口移出去的最左边的值是不是等于队列的最大值front,等于的话 就把front删掉 //队列 是递减的
type MyQueue struct{
queue []int
}
func NewMyQueue() *MyQueue{
return &MyQueue{
queue:make([]int,0),
}
}
func (m *MyQueue)Front()int{
return m.queue[0]
}
func (m *MyQueue)Back()int{
return m.queue[len(m.queue)-1]
}
func (m *MyQueue)Empty()bool{
return len(m.queue) == 0
}
func (m *MyQueue)push(val int){
for !m.Empty() && val > m.Back(){
m.queue = m.queue[:len(m.queue)-1]
}
m.queue = append(m.queue,val)
}
func(m *MyQueue)pop(val int){
if !m.Empty()&&val == m.Front(){
m.queue = m.queue[1:]
}
}
func maxSlidingWindow(nums []int, k int) []int {
queue := NewMyQueue()
length := len(nums)
res := make([]int,0)
for i:=0;i<k;i++{
queue.push(nums[i])
}
res = append(res,queue.Front())
for i:=k;i<length;i++{
queue.pop(nums[i-k])
queue.push(nums[i])
res = append(res,queue.Front())
}
return res
}
\