目录
1.滑动窗口最大值
239. 滑动窗口最大值 - 力扣(LeetCode)
https://leetcode.cn/problems/sliding-window-maximum/
cpp
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> dq;
vector<int> result;
for (int i = 0; i < nums.size(); ++i)
{
// 移除不在窗口范围内的索引
if (!dq.empty() && dq.front() < i - k + 1)
dq.pop_front();
// 移除比当前元素小的索引
while (!dq.empty() && nums[dq.back()] < nums[i])
{
dq.pop_back();
}
// 添加当前索引到队列尾部
dq.push_back(i);
// 如果形成完整窗口,添加最大值到结果
if (i >= k - 1)
result.push_back(nums[dq.front()]);
}
return result;
}
};
a.核心思想
利用双端队列(deque)来维护一个滑动窗口中的潜在最大值的索引,使得队列中的索引对应的元素是单调递减的。这样,队列的头部始终是当前窗口中的最大值的索引。
b.思路
① 初始化一个双端队列
deque和一个结果数组result。② 遍历数组
nums,对于每个元素:
移除队列中不在当前窗口范围内的索引。
移除队列中对应元素小于当前元素的索引,因为这些元素不可能再成为后续窗口的最大值。
将当前元素的索引添加到队列尾部。
如果已经形成了一个完整的窗口(即遍历的元素数量大于等于
k),将队列头部的元素(即当前窗口的最大值)添加到结果数组中。③ 返回结果数组。
c.步骤
① 定义一个双端队列
dq和一个结果向量result。② 遍历
nums数组,索引为i:
移除
dq中所有索引小于i - k + 1的元素(这些元素已经不在当前窗口中)。移除
dq中所有对应元素小于nums[i]的元素。将
i添加到dq的尾部。如果
i >= k - 1,将nums[dq.front()]添加到result中。③ 返回
result。
2.子类的指针转换为父类的指针,指针的值是否会改变
在C++中,单继承时子类指针转父类指针地址通常不变(指向同一基地址);多重继承或虚继承时,若父类子对象存在偏移,地址可能被调整(通过
static_cast或隐式转换自动处理),但指针值本身可能改变。
希望这些内容对大家有所帮助!
感谢大家的三连支持!