滑动窗口最大值/对称二叉树

63 阅读1分钟

//封装一个单调队列 //push的思路:如果窗口加入的值大于队列的back 也就是右侧左小值,那就把back删掉,直到等于小于或者队列长度为0,然后把这个值加进去 //pop的思路:就是看窗口移出去的最左边的值是不是等于队列的最大值front,等于的话 就把front删掉 //队列 是递减的

image.png

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
}

\

image.png