题解 | #滑动窗口的最大值#

滑动窗口的最大值

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
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务