滑动窗口

滑动窗口 单调队列

試著忘記壹切 提交于 2019-12-01 11:40:17
题目: 传送门 很明显,用单调队列 code: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,k,Fmax[1000010],num[1000010],q[1000010],Fmin[1000010]; 4 int a[1000010]; 5 int head,tail; 6 void dmin() 7 { 8 head=1; 9 tail=0; 10 for(int i=1;i<=n;i++) 11 { 12 while(num[head]<i-k+1&&head<=tail)head++; 13 while(a[i]<q[tail]&&head<=tail)tail--; 14 num[++tail]=i; 15 q[tail]=a[i]; 16 Fmin[i]=q[head]; 17 } 18 } 19 void dmax() 20 { 21 head=1; 22 tail=0; 23 for(int i=1;i<=n;i++) 24 { 25 while(num[head]<i-k+1&&head<=tail)head++; 26 while(a[i]>q[tail]&&head<=tail)tail--; 27 num[++tail]=i; 28 q[tail]=a[i]; 29 Fmax[i]=q

滑动窗口求最大值

好久不见. 提交于 2019-11-30 22:32:11
第一种方法:大顶堆 第二种方法:双端队列 public class SlidingWindow { // 输入 : nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 // 输出: [3,3,5,5,6,7] public static void main(String[] args) { int [] arr = new int [] { 1 , 3 ,- 1 ,- 3 , 5 , 3 , 6 , 7 }; int [] res = slide(arr, 3 ); for ( int i = 0 ; i< res.length ;i++ ) { System. out .print(res[i] + " " ); } System. out .println(); res = slide2(arr, 3 ); for ( int i = 0 ; i< res.length ;i++ ) { System. out .print(res[i] + " " ); } } /* * * 我们以数组{2,3,4,2,6,2,5,1}为例,滑动窗口大小为3, * 先把第一个数字2加入队列,第二个数字是3,比2大,所以2不可能是最大值,所以把2删除,3存入队列。 * 第三个数是4,比3大,同样删3存4,此时滑动窗口已遍历三个数字,最大值4在队列的头部。    *

算法--滑动窗口

前提是你 提交于 2019-11-29 15:11:22
转载请标明出处 http://www.cnblogs.com/haozhengfei/p/a14049ec0869a8125a69f3af37471c77.html 滑动窗口练习题 第8节 滑动窗口练习题 有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。 返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值。 以数组为[4,3,5,4,3,3,6,7],w=3为例。因为第一个窗口[4,3,5]的最大值为5,第二个窗口[3,5,4]的最大值为5,第三个窗口[5,4,3]的最大值为5。第四个窗口[4,3,3]的最大值为4。第五个窗口[3,3,6]的最大值为6。第六个窗口[3,6,7]的最大值为7。所以最终返回[5,5,5,4,6,7]。 给定整形数组 arr 及它的大小 n ,同时给定 w ,请返回res数组。保证 w 小于等于 n ,同时保证数组大小小于等于500。 测试样例: [4,3,5,4,3,3,6,7],8,3 返回:[5,5,5,4,6,7] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class SlideWindow { 4 public int[] slide(int[] arr, int n, int w) { 5 /

(16)Go滑动窗口求存在重复元素

回眸只為那壹抹淺笑 提交于 2019-11-29 06:36:55
思路:如果t==0,则变成219题目,解决方法 参考:(15)Go查找表配合滑动窗口求存在重复元素----https://www.jianshu.com/p/78c421a40023 滑动窗口方法:处理t==0和t>0的情况,如果t==0下面的方法时间复杂度是O(2n)=O(n) 维持1个长度为<=k的滑动窗口,若窗口内有不同元素的绝对值<=t,返回true 时间复杂度O(n^2) func containsNearbyAlmostDuplicate(nums []int, k int, t int) bool { if k == 0 { return false } startI := 0 endI := 1 for startI < len(nums)-1 { // startI != endI不能省略,因为k=1时,两者可能相等,出现自己跟自己比较的情况 if startI != endI && abs(nums[endI]-nums[startI]) <= t { return true } // 维持长度为k的[startI...endI]区间 if endI-startI == k || len(nums)-1 == endI { startI++ // 如果t==0,时间复杂度是O(2n)=O(n) // 如果t!=0,每次startI+1

滑动窗口

[亡魂溺海] 提交于 2019-11-29 03:38:36
1 class Solution{ 2 public: 3 vector<int> maxInWindows(const vector<int> &nums,unsigned int size){ 4 vector<int> res; 5 if(nums.empty() || size <= 0) 6 return res; 7 8 //滑动窗口 用一个双端队列来记录窗口的最大值 9 /* 10 判断逻辑 11 队列是空 直接加入 12 队列不为空 和对尾元素进行比较 如果比队尾元素小 加到队尾 13 如果比队尾元素大 队尾元素一直弹出 直到大于插入元素 14 需要注意的点: 15 1.队首元素的过期 去除问题 q.front() == i-w 比如三个元素 窗口大小是2 16 如果此时队首是第一个元素 也就是0 遍历到第三个元素的时候 index是2 就需要弹出队首 17 2.拿出队首加到结果集中 什么时候开始需要记录 n个元素 最多有n-w+1个窗口 因此i>= w-1 18 */ 19 deque<int> d; 20 for(int i = 0;i<nums.size();i++){ 21 while(!d.empty() && nums[d.back()] <= nums[i]) 22 d.pop_back(); 23 d.push_back(i); 24 if(d

TCP之滑动窗口----流量控制

房东的猫 提交于 2019-11-28 21:55:39
1.什么是滑动窗口 指的是接收方能接收数据的能力,即:接收缓冲区大小 2.滑动窗口的作用 为了实现流量控制 3.滑动窗口的处理 如果对方返回的窗口大小win为0的话,表示对方暂时不能接收数据,并会给对方发送一个探测报文,直到对方回复的报文窗口win大小不为0 如果对方返回的窗口大小win不为0,则表示可以发送数据,数据内容为[ack,ack+win窗口) 假设网络是理想的,不拥塞,只要发了数据,对方一定能收到 4.滑动窗口与拥塞窗口的区别 滑动窗口:指的是接收方的能力 拥塞窗口:发送方一次想发多少字节的数据 来源: https://blog.csdn.net/Hh20161314/article/details/100133597

剑指:滑动窗口的最大值

a 夏天 提交于 2019-11-28 16:40:28
题目描述 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 例如,如果输入数组 [2, 3, 4, 2, 6, 2, 5, 1] 及滑动窗口的大小 3,那么一共存在 6 个滑动窗口,它们的最大值分别为 [4, 4, 6, 6, 6, 5] 。 注意: 数据保证 k 大于 0,且 k 小于等于数组长度。 样例 输入:[2, 3, 4, 2, 6, 2, 5, 1] , k=3 输出: [4, 4, 6, 6, 6, 5] 解法 利用双向队列,保证队列头部存放的是最大值的下标,当队列头部下标过期时弹出。 细节: 当数组元素小于队列头部下标对应的元素时,在队列尾部中插入数组元素下标。(如果队列尾部有比该元素小的元素,先弹出,再插入。) 当数组元素大于或等于队列头部下标构成的元素时,弹出元素直至队列为空,再插入数组元素下标。 import java.util.*; public class Solution { /** 用一个双端队列,队列第一个位置保存当前窗口的最大值,当窗口滑动一次 1.判断当前最大值是否过期 2.新增加的值从队尾开始比较,把所有比他小的值丢掉 */ public ArrayList<Integer> maxInWindows(int [] num, int size) { if(num==null || num.length==0 || size<=0 |

leetcode 239. 滑动窗口最大值(python)

本秂侑毒 提交于 2019-11-28 15:47:22
1. 题目描述 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 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 提示: 你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。 2. 代码 class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: if k == 1: return nums if not nums: return [] if k > len(nums): return [max(nums)] n = len(nums) - k + 1 ans = [] for i in range(n):

cogs 495. 滑动窗口 单调队列

折月煮酒 提交于 2019-11-28 13:54:39
495. 滑动窗口 ★★ 输入文件: window.in 输出文件: window.out 简单对比 时间限制:2 s 内存限制:256 MB 【问题描述】 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: Window position Min value Max value [ 1 3 -1 ] -3 5 3 6 7 -1 3 1 [ 3 -1 -3 ] 5 3 6 7 -3 3 1 3 [ -1 -3 5 ] 3 6 7 -3 5 1 3 -1 [ -3 5 3 ] 6 7 -3 5 1 3 -1 -3 [ 5 3 6 ] 7 3 6 1 3 -1 -3 5 [ 3 6 7 ] 3 7 你的任务是找出窗口在各位置时的max value,min value. 【输入格式】 第一行n,k,第二行为长度为n的数组 【输出格式】 第一行每个位置的min value,第二行每个位置的max value 【输入输出样例】 window.in 8 3 1 3 -1 -3 5 3 6 7 window.out -1 -3 -3 -3 3 3 3 3 5 5 6 7 【数据范围】 20%:n≤500; 50%:n≤100000;100%:n≤1000000; 多年未敲(不禁心生疑惑 我一共才学了几年!?

LeetCode(239)滑动窗口最大值

馋奶兔 提交于 2019-11-28 13:49:36
堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值; ·堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 队列:什么是队列?又该怎么理解呢? ①队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 ②队列中没有元素时,称为空队列。 ③建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。 ④队列采用的FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素