【10.8】队列-解望远镜中最高的海拔

目录

一、题目

二、解题思路

方法思路

三、代码实现


 

 🎬 攻城狮7号个人主页

🔥 个人专栏: 《C/C++算法》

⛺️ 君子慎独!

 🌈 大家好,欢迎来访我的博客!
⛳️ 此篇文章主要讲解算法题目:解望远镜中最高的海拔
📚 本期文章收录在《C/C++算法》,大家有兴趣可以自行查看!
⛺️ 欢迎各位 ✔️ 点赞 👍 收藏 ⭐留言 📝!

一、题目

        科技馆内有一台虚拟观景望远镜,它可以用来观测特定纬度地区的地形情况。该纬度的海拔数据记于数组 heights ,其中 heights[i] 表示对应位置的海拔高度。请找出并返回望远镜视野范围 limit 内,可以观测到的最高海拔值。

示例 1:

输入:heights = [14,2,27,-5,28,13,39], limit = 3
输出:[27,27,28,28,39]
解释:
  滑动窗口的位置                最大值
---------------               -----
[14 2 27] -5 28 13 39          27
14 [2 27 -5] 28 13 39          27
14 2 [27 -5 28] 13 39          28
14 2 27 [-5 28 13] 39          28
14 2 27 -5 [28 13 39]          39

提示:

你可以假设输入总是有效的,在输入数组不为空的情况下:

  • 1 <= limit <= heights.length
  • -10000 <= heights[i] <= 10000

二、解题思路

        为了解决这个问题,我们需要找到每个长度为 limit 的滑动窗口中的最大海拔值。我们可以使用单调队列可以高效地维护当前窗口的最大值,从而在遍历数组时快速获取每个窗口的最大值。

方法思路

  1. 单调队列:维护一个双端队列(deque),用于存储当前窗口内可能成为最大值的元素索引。队列中的元素按递减顺序排列,确保队首元素始终是当前窗口的最大值。

  2. 滑动窗口:遍历数组中的每个元素,作为窗口的右边界。在每次遍历过程中,调整队列以保证其单调性,并移除不在当前窗口内的元素。

  3. 结果记录:当窗口形成(即遍历到足够多的元素时),将队首元素对应的值加入结果数组。

三、代码实现

#include <iostream>
#include <vector>
#include <deque>

using namespace std;

vector<int> maxSlidingWindow(vector<int>& heights, int limit) {
    vector<int> res;
    deque<int> dq;
    int n = heights.size();
    
    for (int i = 0; i < n; ++i) {
        // 维护单调递减队列
        while (!dq.empty() && heights[i] >= heights[dq.back()]) {
            dq.pop_back();
        }
        dq.push_back(i);
        
        // 移除不在当前窗口中的队首元素
        while (!dq.empty() && dq.front() < i - limit + 1) {
            dq.pop_front();
        }
        
        // 当窗口形成时,记录结果
        if (i >= limit - 1) {
            res.push_back(heights[dq.front()]);
        }
    }
    
    return res;
}

int main() {
    // 示例1
    vector<int> heights1 = {14, 2, 27, -5, 28, 13, 39};
    int limit1 = 3;
    vector<int> res1 = maxSlidingWindow(heights1, limit1);
    cout << "示例1结果: ";
    for (int num : res1) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

        该方法的时间复杂度为 O(n),每个元素最多被加入和弹出队列一次,保证了高效性。

看到这里了还不给博主点一个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
再次感谢大家的支持!
你们的点赞就是博主更新最大的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值