剑指 Offer 59 - II. 队列的最大值
https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/
类似与最小栈,首先为了实现队列的功能要维护一个普通的队列,而在最大元素出队时需要知道第二大的元素,因此还需要维护一个 非严格递减 的单调队列。
如果进来了一个较大的元素,由于先进队的元素会先出队,则前面所有比它小的元素都不可能是最大值,可以直接将它们删除而不影响结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
   | type MaxQueue struct {     queue []int     descQ []int   }
 
  func Constructor() MaxQueue {     return MaxQueue{make([]int, 0), make([]int, 0)} }
 
  func (this *MaxQueue) Max_value() int {     n := len(this.descQ)     if n == 0 {         return -1     }     return this.descQ[0] }
 
  func (this *MaxQueue) Push_back(value int)  {     this.queue = append(this.queue, value)
           for len(this.descQ) > 0 && this.descQ[len(this.descQ)-1] < value {             this.descQ = this.descQ[:len(this.descQ)-1]     }     this.descQ = append(this.descQ, value) }
 
  func (this *MaxQueue) Pop_front() int {     if len(this.queue) == 0 {         return -1     }
      res := this.queue[0]     this.queue = this.queue[1:]
      if len(this.descQ) > 0 && res == this.descQ[0] {         this.descQ = this.descQ[1:]     }     return res }
 
  |