刷题笔记day13-栈和队列part03

239. 滑动窗口最大值


func maxSlidingWindow(nums []int, k int) []int {
    // 思路:用一个单调队列(入口方向看,是递增的)
    // 往队列中push的时候,只要比入口大,就弹出入口元素,直到小于前面的值时,插入当前值。
    // 滑动窗口的时候,删除尾值,如果比队列中的出口元素一样,则删除,否则就不用操作
    // 那么que的队头一直是最大值。
    
    que := &Queue{}
    result := []int{}
    // 先push进去k个
    
    for i := 0; i < k && i < len(nums); i++ {
        que.push(nums[i])
    }
    result = append(result, que.front())
    for i := k; i < len(nums); i++ {
        // 移除队尾v,
        v := nums[i - k]
        // 然后比较v和队列的队头的值,等于则移除
        // 因为队头是最大的
        que.pop(v) // 删除旧元素
        que.push(nums[i]) //追加新元素
        result = append(result, que.front())
    }
    return result
}

type Queue struct {
    data []int
    length int
}

func (q *Queue) push(v int) {
    // push,入口的比 v 小就删除
    for !q.empty() && v > q.back() {
        q.pop_back()
    }
    q.push_back(v)
}

func (q *Queue) push_back(v int) {
    q.data = append(q.data, v)
    q.length++
}

func (q *Queue) back() (v int) {
    return q.data[q.length - 1]
}

func (q *Queue) pop(v int) {
    if v == q.front() {
        q.pop_front()
    }
}

func (q *Queue) front() (v int) {
    return q.data[0]
}

func (q *Queue) pop_front() {
    q.data = q.data[1:]
    q.length--
}

func (q *Queue) pop_back() {
    q.data = q.data[:q.length - 1]
    q.length--
}

func (q *Queue) empty() bool {
    return q.length <= 0
}

8.前 K 个⾼频元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值