目录
🎬 攻城狮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
的滑动窗口中的最大海拔值。我们可以使用单调队列可以高效地维护当前窗口的最大值,从而在遍历数组时快速获取每个窗口的最大值。
方法思路
-
单调队列:维护一个双端队列(deque),用于存储当前窗口内可能成为最大值的元素索引。队列中的元素按递减顺序排列,确保队首元素始终是当前窗口的最大值。
-
滑动窗口:遍历数组中的每个元素,作为窗口的右边界。在每次遍历过程中,调整队列以保证其单调性,并移除不在当前窗口内的元素。
-
结果记录:当窗口形成(即遍历到足够多的元素时),将队首元素对应的值加入结果数组。
三、代码实现
#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),每个元素最多被加入和弹出队列一次,保证了高效性。
看到这里了还不给博主点一个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
再次感谢大家的支持!
你们的点赞就是博主更新最大的动力!