题目描述
给定一个长度为 n 的数组 nums 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
代码
最为简单直接的方法
class Solution
{
public:
vector<int> maxInWindows(const vector<int>& nums, int size)
{
vector<int> res;
if (nums.size() == 0 || size<1 || size>nums.size())return res;
int vector_size = nums.size() - size + 1;
int vec_index = 0;
while (vec_index < vector_size)
{
int index = 1;
int max_val = nums[vec_index];
while (index < size)
{
max_val = max(max_val, nums[vec_index + index]);
index++;
}
res.push_back(max_val);
vec_index++;
}
return res;
}
};
对上个方法做出简单改进
核心思路:减少比较次数
若上一个滑动窗口取得的最大值是上一个窗口的第一个元素(即当前滑动窗口的前一个元素),则在当前窗口对所有元素进行比较,取最值;
若上一个滑动窗口取得的最大值不是其第一个元素,则只需要比较当前窗口的最后一个元素和上一个滑动窗口取得的最大值。
class Solution
{
public:
vector<int> maxInWindows(const vector<int>& nums, int size)
{
vector<int> res;
if (nums.size() == 0 || size<1 || size>nums.size())return res;
//if (size == 1)return nums;
int max_index = -1;
int vec_size = nums.size() - size + 1;
int vec_index = 0;
int max_val = 0;
while (vec_index < vec_size)
{
int dev = 1;
if (max_index == vec_index - 1)
{
max_val = nums[vec_index];
max_index = vec_index;
while (dev < size)
{
if (nums[vec_index + dev] > max_val)
{
max_val = nums[vec_index + dev];
max_index = vec_index + dev;
}
dev++;
}
}
else
{
max_val = max(nums[max_index], nums[vec_index + size - 1]);
nums[max_index] > nums[vec_index + size - 1] ? max_index = max_index : max_index = vec_index + size - 1;
}
res.push_back(max_val);
vec_index++;
}
return res;
}
};