问题描述:
给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧,你只可以看到在滑动窗口内的K个数字。滑动窗口每次向右只能移动一位,返回滑动窗口中的最大值。
问题分析:
如果是只要找某个区间内的最大值,那这个过程就比较简单,直接采用遍历的算法即可,但是这个题目要求我们找一个滑动窗口内内的最大值,这就需要我们进行分类讨论了。
【1】如果上一个窗口的最大值在最左边,则下一个窗口内的所有值都需要遍历查找;
【2】如果上一个窗口的最大值不在最左边,则只需要将这个最大值与新加入窗口的值进行比较大小即可。
class Solution{
public:
int findMax(vector<int>& nums, int left,int right)
{
int max = nums[left];
for(int i=left+1;i<=right;i++)
{
if(nums[i]>max) max = nums[i];
}
return max;
}
vector<int> maxSlidingWindow(vector<int>& nums, int k)
{
int len = nums.size();
vector<int> res;
if(len==0||k>len) return res;
int left = 0;
int right = k-1; //窗口的值
int curMax =0;
int subMax = 0;
int i = left;
curMax = findMax(nums,left,right); //找滑动窗口中的最大值
res.push_back(curMax);
while(right<nums.size()-1)
{
right++;
left++;
if(curMax == nums[left-1]) //如果当前最大值为最左边位置的值
{
subMax = findMax(nums,left,right); //找出最大值
}
else subMax = curMax; //其他情况就是保存当前最大值
curMax = subMax>nums[right]?subMax:nums[right];
res.push_back(curMax);
}
return res;
}
};