首页 > 编程知识 正文

sentinel滑动窗口算法原理,接收窗口最大值

时间:2023-05-03 17:20:13 阅读:26884 作者:3469

请给出剑指Offer 59 - I .滑动窗口的最大值数组nums和滑动窗口的大小k,找出所有滑动窗口的最大值。

样本:

输入: nums=[ 1,3,-1,- 3,5,3,6,7 ]和k=3

输出:[3、3、5、5、6、7]

说明:

滑动窗口位置的最大值

[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

思路是利用deque构建单调递增队列,每次前部是当前滑动窗口的最大值; 对于每个push_back,确保当前元素小于或等于最后一个元素。 否则,继续push_back,直到当前元素小于或等于最后一个元素。 每次删除幻灯片窗口中的最后一个值时,将其与当前起始值进行比较,如果删除的值正好是起始值,则不操作pop_front;否则不操作;

//构建单调递增队列,每个队列的第一个元素是当前窗口的最大值class MyQueue{ dequeint que; 如果public: //队列不为空,且当前值小于或等于队列中的最后一个值,则进入队列。队列中的最后一个元素是当前值等于队列中最后一个值voidpush(intvalue ) { while (! QUE.empty(que.back ) ) value ) { que.pop_back ); //当前值小于或等于队列末尾的值,当前值为队列que.push_back(value ); //如果要在幻灯片窗口中删除的元素等于当前队列的第一个元素,则队列的第一个元素将退出队列。 (删除的元素是否是当前窗口的最大值,是否删除队列的第一个元素) /否则,如果删除的元素不是当前窗口的最大值,则队列的元素是voidpop(intvalue ) if (! que.empty(que.front )==value ) ) que.pop_front ); } int front () { return que.front ); }; public : vectorintmaxslidingwindow (vectorintnums,int k ) { MyQueue que; 矢量int result; if(k==0)返回结果; //将前k个排队的for(intI=0; i k; I ) que.push(nums[I]; result.push_back(que.front ) ); //滑动窗口,pop后推送(intI=k; i nums.size (; I ) ) que.pop(nums[I-k] ); QUE.push(nums[I]; result.push_back(que.front ) ); }返回结果; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。