题解 | #滑动窗口的最大值#
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
思路:最好不要直接对每个滑动窗口进行比较取最大值,不然容易造成超时
我们可以从下面几个方向考虑:
1.初始化:将第一个滑动窗口的最大值提取出来,然后放到结果中去,同时要维护一个最大值的位置的变量
2.遍历:随着滑动窗口的移动,可以有几种选择
1)如果最大值的位置仍处于这个滑动窗口期,那么此时滑动窗口最大值不变
2)如果此时最大值的位置小于窗口,当新加入的值大于前最大值,那么直接将最大位置的变量更新为新加入的值的位置
若是新加入的值小于前最大值,那么此时需要重新构建滑动窗口,然后拿出最大值即可,重复之前的步骤
class Solution {
private:
int temp_maxval = INT_MIN;
public:
vector<int> maxInWindows(const vector<int>& nums, int size) {
int iSize = nums.size();
vector<int> vec_res;
if(iSize < size)
{
//没理解,为什么这里就不对
const int i = *max_element(nums.begin(), nums.begin() + iSize);
vec_res.push_back(i);
return vec_res;
}
vector<int> vec_win;
vec_win.assign(nums.begin(), nums.begin() + size);
//temp_maxval = max(temp_maxval, *max_element(vec_win.begin(), vec_win.end()));
int max_position = max_element(vec_win.begin(), vec_win.end()) - vec_win.begin();
vec_res.push_back(nums[max_position]);
for(int i = size; i< iSize; i++)
{
//记录每次滑动窗口的最大值所在的位置
if(max_position >= i - size + 1 && nums[max_position] >= nums[i])
{
vec_res.push_back(nums[max_position]);
}
else if(max_position < i -size + 1&& nums[max_position] <= nums[i])
{
max_position = i;
vec_res.push_back(nums[max_position]);
}
else if(max_position >= i - size + 1 && nums[max_position] < nums[i])
{
max_position = i;
vec_res.push_back(nums[max_position]);
}
else{
vector<int> temp;
temp.assign(nums.begin() + i - size + 1, nums.begin() + i + 1);
//max_position代表的是当前的vec的指针位置,我们需要做的是还原即可
max_position = max_element(temp.begin(), temp.end()) - temp.begin() + i - size + 1;
vec_res.push_back(nums[max_position]);
}
}
return vec_res;
}
};