LeetCode 239. 滑动窗口最大值

172 阅读1分钟
  • 单调递减队列
  • 利用单调队列存下标, 头部是区间最大值 max 对应的下标
  • 根据当前下标对应值的大小,把当前下标放到队列合适的位置
  • 只要构成了滑动窗口,就可以把队列最大值(头部)对应的值 放到结果数组中
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    deque<int> q;
    vector<int> res;

    for(int i = 0; i < nums.size(); i ++ ) {
        if(q.size() && i - k + 1 > q.front()) q.pop_front();//自然出队,大于滑动窗口大小
        while(q.size() && nums[i] >= nums[q.back()]) q.pop_back();//把当前元素加进去,如果要加入的元素大于队列中的值,把队列中小于该值的值全部删除
        q.push_back(i);
        if(i >= k - 1) res.push_back(nums[q.front()]);//表示当前窗口中至少右k个元素
    }

    return res;
}
int main(){
    vector<int> nums = {1,3,-1,-3,5,3,6,7};
    vector<int> res = maxSlidingWindow(nums, 3);
    for(auto x : res)
        cout << x << ' ';
    return 0;
}