Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.
For example,
Given nums = [1,3,-1,-3,5,3,6,7]
, and k = 3.
Window position Max
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
Therefore, return the max sliding window as [3,3,5,5,6,7]
.
Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.
Follow up:
Could you solve it in linear time?
Subscribe to see which companies
分析:
使用两端同时变换的方法,每前进一步,先判断是不是最大数移出,若是,则重新循环一边,若不是则判断新进入的数是不是最大数,要灵活应用迭代器位置和值同步记录的方法,其实用寻秩访问的方法也可以做到。最差情况应该可能达到O(n^2)
代码如下:
using po=vector<int>::iterator;
class Solution {
po findmax(po first,po right)
{
po result=first;
for(po t=first+1;t!=right;++t)
{
if(*t>*result) result=t;
}
return result;
}
public:
// using po=vector<int>::iterator;
// typedef vector<int>::iterator po;
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
if(nums.size()==0) return result;
auto local_max=findmax(nums.begin(),nums.begin()+k);
po lo=nums.begin(),hi=nums.begin()+k-1;
while(hi<nums.end())
{
local_max=lo<=local_max?local_max:findmax(lo,lo+k);
local_max=*(hi)>*local_max?hi:local_max;
result.push_back(*local_max);
lo++;
hi++;
}
return result;
}
};