方法一:滑动窗口
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
if( nums.size() == 0 || k < 1 || nums.size() < k )
return result;
int maxIndex = -1;
int temp_max = -1;
for( int i = 0; i < nums.size() - k + 1; i++)
{
//记录最大值下表
if( maxIndex >= i )
{
if( nums[ i + k - 1] > temp_max )
{
temp_max = nums[i + k - 1];
maxIndex = i + k - 1;
}
}
//窗口中最大值下表是滑动窗口的前一个
else
{
temp_max = nums[i];
for(int j = i; j < i + k; j++)
{
if( temp_max < nums[j] )
{
temp_max = nums[j];
maxIndex = j;
}
}
}
result.push_back( temp_max );
}
return result;
}
};
方法二:队列
每次插入一个数,弹出一个数
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
deque<int> deq;
if( nums.size() == 0 || k < 1 || nums.size() < k )
return result;
for( int i = 0; i < nums.size(); i++ )
{
while( !deq.empty() && deq.front() <= i - k )
deq.pop_front();
while( !deq.empty() && nums[i] >= nums[deq.back()] )
deq.pop_back();
deq.push_back(i);
if( i >= k - 1)
result.push_back( nums[deq.front()] );
}
return result;
}
};