数据结构——图解循环队列长度计算问题

本文详细介绍了循环队列的概念,通过时钟指针的类比解释了其工作原理。循环队列允许在队列满时仍能进行元素的入队,通过(front+1)% maxSize和(rear+1)% maxSize计算出队和入队后的指针位置,确保空间的有效利用。队列长度的计算则需要考虑front和rear的关系,防止出现负数或超过最大值的情况。循环队列提高了队列操作的效率,避免了空间浪费。

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

队列定义是这样的

#define MAXSIZE 10
typedef struct{
   
	ElemType data[MAXSIZE];
	int front,rear;
} SeqQueue;

一个队列 = 一个存放元素的数组 + 一个队头指针 + 一个队尾指针

front:控制出队
rear:控制入队

我们先做个规定:
front指向队头元素
rear指向队尾元素的下一个元素(当然也可以让

### 滑动窗口算法工作原理 滑动窗口是一种高效的优化技术,主要用于处理数组或字符串中的子序列问题。其核心思想是在数据结构上维护一个“窗口”,并通过动态调整窗口的大小位置来解决问题。 #### 工作流程 1. **初始化** 使用两个指针 `left` `right` 来定义窗口的左右边界,初始时均指向数组或字符串的起始位置。同时,根据需初始化用于记录窗口状态的变量,例如窗口内元素的总、不同元素的数量等[^4]。 2. **扩展窗口** 移动右指针 `right` 向右扩大窗口范围,并将新加入窗口的元素纳入计算。此时需更新与窗口相关的状态变量。 3. **收缩窗口** 当前窗口可能过大或不符合题目要时,通过移动左指针 `left` 收缩窗口范围,直到满足特定条件为止。在此过程中同样需要同步更新状态变量。 4. **循环执行** 不断重复上述两步操作,直至右指针遍历至数组或字符串末端。期间依据实际问题的需记录最优解或其他必要信息。 --- ### 可视化表示 为了更直观理解滑动窗口的工作机制,下面提供了一个简单的图解说明: 假设我们有一组连续整数 `[1, 3, -1, -3, 5, 3, 6, 7]`,目标是从这些数字中找到最大值随时间变化的情况(即长度为 k 的滑动窗口的最大值)。以下是逐步过程展示: #### 初始阶段 - 设定窗口宽度为 3 (`k=3`)。 - 初始化双端队列存储索引以便快速访问当前窗口内的最大值。 | 步骤 | 数组 | 窗口 | 队列 | |------|------------|--------------|-------------| | 0 | [1, 3,-1...] | [] | [] | #### 动态调整 随着右指针不断向右推进,每次都将新的数值尝试存入队列并移除那些不可能成为候选者的较小值;当超出指定区间界限时,则由左侧释放对应项完成缩减动作。 最终形成如下表格形式的变化轨迹: | Step | Array | Window | Queue | Result | |------|------------|------------|-------------|--------| | 1 | [1,**3**,..]| [1,3] | [1]→[ ]→[2]|[3] | | ... | | | | | 此表仅作为示意用途,在真实应用场景下会更加复杂多样。 ```python from collections import deque def maxSlidingWindow(nums, k): dq = deque() result = [] for i in range(len(nums)): # Remove indices of elements not from sliding window if dq and dq[0] < i - k + 1: dq.popleft() # Remove all elements smaller than the currently being added element (remove useless elements) while dq and nums[dq[-1]] <= nums[i]: dq.pop() dq.append(i) # Add to results once we have our first complete window if i >= k - 1: result.append(nums[dq[0]]) return result ``` 以上代码实现了寻找给定范围内每段固定长度子数组里的最值功能,其中运用到了先进先出的数据结构——双向链表Deque辅助管理潜在极值候选项们的位置关系。 --- ### §相关问题§ 1. 如何利用滑动窗口解决最小覆盖字串问题? 2. 在什么情况下应该选用固定尺寸还是可变尺寸的滑动窗口策略? 3. 能否举例说明滑动窗口如何应用于多维矩阵而非一维线性结构之中? 4. 是否存在某些特殊情形使得标准版滑动窗口无法适用?如果有的话该如何改进算法设计思路去应对它们呢? 5. 探讨一下基于优先级队列版本相较于传统列表方式实现滑动窗口性能差异及其背后原因分析。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值