数据结构之滑动窗口的最大值

本文介绍了如何使用Python实现一个单调递减队列,解决给定数组nums和整数k的问题,通过维护队列中元素的递减顺序找到长度为k的最大子序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

import "fmt"

type DuQueue struct {
	Q []int
}

/*
	单调递减队列
*/
func main() {
	// nums = [1,3,-1,-3,5,3], k = 3
	// 输出:[3,3,5,5]
	nums := []int{4, 3, -1, -3, 5, 3}
	k := 3
	winQ := &DuQueue{}
	ans := []int{}
	winQ.Q = make([]int, 0)
	// 元素<k,直接取出单调递减队列最大值
	if len(nums) <= k {
		for _, item := range nums {
			winQ.RPush(item)
		}
		max := winQ.GetFirstE()
		ans = append(ans, max)
	} else {
		for i, item := range nums {
			// 前K个元素直接push到单调队列中
			if i < k-1 {
				winQ.RPush(item)
				continue
			}
			winQ.RPush(item)
			// 单调队列中已经添加K个元素
			// 获取单调队列最大值
			max := winQ.GetFirstE()
			ans = append(ans, max)
			winQ.LPop(nums[i-(k-1)])
		}
	}
	fmt.Println(ans)
}

// 右边插入元素
func (d *DuQueue) RPush(newElement int) {
	// 队列为空
	if len(d.Q) == 0 {
		d.Q = append(d.Q, newElement)
		return
	}
	//判断队尾元素和当前元素大小,
	for {
		last := d.GetLastE()
		//
		if last < newElement {
			if len(d.Q) > 0 {
				d.RPop()
			} else {
				d.Q = append(d.Q, newElement)
				break
			}
		} else {
			d.Q = append(d.Q, newElement)
			break
		}
	}
}

// 右边pop元素
func (d *DuQueue) RPop() {
	if len(d.Q) == 0 {
		return
	}
	d.Q = d.Q[:len(d.Q)-1]
}

// 获取队列中最后一个元素
func (d *DuQueue) GetLastE() int {
	if len(d.Q) > 0 {
		return d.Q[len(d.Q)-1:][0]
	}
	return 0
}

// 获取队列中第一个元素
func (d *DuQueue) GetFirstE() int {
	if len(d.Q) > 0 {
		return d.Q[0]
	}
	return 0
}

// 右边pop元素
func (d *DuQueue) LPop(val int) {
	if len(d.Q) == 0 {
		return
	}
	first := d.GetFirstE()
	if first == val {
		d.Q = d.Q[1:]
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值