21xrx.com
2024-12-27 04:55:39 Friday
登录
文章检索 我的文章 写文章
C++中的单调队列实现
2023-07-05 11:07:14 深夜i     --     --
C++ 单调队列 实现 数据结构 优化

单调队列是一种特殊的数据结构,在C++中,使用deque容器来实现单调队列。单调队列主要用于解决一类特殊的滑动窗口问题,可以实现O(n)的时间复杂度。

单调队列的应用

最典型的应用是在LeetCode上的239题Sliding Window Maximum中。题目描述为,给定一个整形数组和一个滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,数组为[1,3,-1,-3,5,3,6,7],窗口大小为3时,滑动窗口的最大值为[3,3,5,5,6,7]。

单调队列的实现

单调队列的核心思想是维护队列中元素的递增或递减性质。对于新进来的元素i,将队列中比i小的元素全部弹出,保证队列是递增的。同时,如果队列头已经不在滑动窗口的范围内,将队头元素弹出。这样,单调队列中的最大值即为队头元素。

deque是STL中的一个容器,支持双端队列的操作。我们使用deque来实现单调队列的功能。

C++实现代码如下:

vector maxSlidingWindow(vector & nums, int k) {

  vector ans; // 答案数组

  deque q; // 单调队列

  for (int i = 0; i < nums.size(); ++i) {

    if (!q.empty() && q.front() < i - k + 1) q.pop_front(); // 保证队列头在范围内

    while (!q.empty() && nums[q.back()] < nums[i]) q.pop_back(); // 保证队列单调递减

    q.push_back(i); // 入队

    if (i >= k - 1) ans.push_back(nums[q.front()]); // 满足窗口大小时,存储队列头元素

  }

  return ans;

}

总结

单调队列是一种高效的数据结构,在解决滑动窗口问题时非常实用。在C++中,我们可以使用deque容器来实现单调队列,重点在于维护队列的单调性质。掌握单调队列的实现能够大大提高编程效率和解题能力。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复