题解 | #滑动窗口的最大值#
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
package main type Heap struct { data []int n int count int } func newHeap(n int) Heap { return Heap{ data: make([]int, n+1), n: n, count: 0, } } func (h *Heap) Insert(data int) { if h.count >= h.n { return } h.count++ h.data[h.count] = data i := h.count h.heapify2(i) } func (h *Heap) heapify2(i int) { for i/2 > 0 && h.data[i] > h.data[i/2] { h.data[i], h.data[i/2] = h.data[i/2], h.data[i] i /= 2 } } func (h *Heap) getMax() int { return h.data[1] } func (h *Heap) remove(v int) { vI := 0 for i := 1; i <= h.count; i++ { if h.data[i] == v { vI = i break } } h.data[vI] = h.data[h.count] if h.data[h.count] > v { h.heapify2(vI) } if h.data[h.count] < v { h.heapify(vI) } h.count-- } func (h *Heap) heapify(i int) { for { maxPos := i if i*2 <= h.n && h.data[i] < h.data[i*2] { maxPos = 2 * i } if i*2+1 <= h.n && h.data[maxPos] < h.data[2*i+1] { maxPos = 2*i + 1 } if maxPos == i { break } h.data[maxPos], h.data[i] = h.data[i], h.data[maxPos] i = maxPos } } func maxInWindows(num []int, size int) []int { if len(num) < size || size == 0 { return []int{} } if size == 1 { return num } heap := newHeap(size) max := []int{} for i := 0; i < size; i++ { heap.Insert(num[i]) } max = append(max, heap.getMax()) for i := size; i < len(num); i++ { heap.remove(num[i-size])//删除过期元素 heap.Insert(num[i])//插入当前元素 max = append(max, heap.getMax())//获取堆顶元素 } return max }