滑动窗口

LeetCode 滑动窗口最大值

半腔热情 提交于 2019-11-27 03:48:23
题目链接: https://leetcode-cn.com/problems/sliding-window-maximum/ 题目大意   略。 分析   可以用双端队列来维护窗口内最大值。   双端队列队首存窗口内最大值下标,双端队列内部下标单调递增,所对应值单调不增。 代码如下 1 class Solution { 2 public: 3 vector<int> maxSlidingWindow(vector<int>& nums, int k) { 4 vector< int > ans; 5 deque< int > DQ; 6 7 if(nums.empty()) return ans; 8 for(int i = 0; i <= k - 1; ++i) { 9 while(!DQ.empty() && nums[i] > nums[DQ.back()]) DQ.pop_back(); 10 DQ.push_back(i); 11 } 12 13 ans.push_back(nums[DQ.front()]); 14 for(int i = k; i < (int)nums.size(); ++i) { 15 if(i - k == DQ.front()) DQ.pop_front(); 16 while(!DQ.empty() && nums[i] > nums[DQ

滑动窗口的最大值

拈花ヽ惹草 提交于 2019-11-27 03:24:09
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。 无脑法: def maxInWindows(self, num, size): # write code here l = [] if size <= 0: return l n = len(num) - size + 1 for i in range(n): temp = max(num[i:i+size]) l.append(temp) return l 维护一个队列,从后面依次弹出队列中比当前num值小的元素,同时也能保证队列首元素为当前窗口最大值下标;当当前窗口移出队首元素所在的位置,即队首元素坐标对应的num不在窗口中,需要弹出;把每次滑动的num下标加入队列。当滑动窗口首地址i大于等于size时才开始写入窗口最大值到最终输出res。 def

[滑动窗口] leetcode 76 Minimum Window Substring

故事扮演 提交于 2019-11-27 00:39:53
problem: https://leetcode.com/problems/minimum-window-substring/ 滑动窗口题。维护一个包含t中所有字符的最小滑动窗口,首先用一个hashmap记录所有t中的字符和出现次数,在s中每遇到一次计数器加一,找到了符合条件的窗口后,尝试向右移动窗口左指针,直到恰好能够满足条件为止。更新当前最小滑动窗口。 class Solution { public: string minWindow(string s, string t) { vector<int> dstChar(256,0); for(auto c: t) { dstChar[c]++; } string res; int count = t.size(); int begin = 0; for(int i = 0;i < s.size(); i++) // end { dstChar[s[i]]--; if(dstChar[s[i]] >= 0) { count--; } if(count == 0) { while(dstChar[s[begin]] + 1 <= 0) { dstChar[s[begin]]++; begin++; } int len = i - begin + 1; if(res.empty() || len < res.size()) {

单调队列 洛谷P1886 滑动窗口

安稳与你 提交于 2019-11-27 00:11:09
题目链接: https://www.luogu.org/problem/P1886 题意:给一串一维数字序列,并给你一个长为k的小框,从左到右一格格滑过去,求每次小框内的最大值最小值分别为多少。 据说是单调队列模板题。讲解洛谷排第一的题解就讲的很好。 简略说就是维护一个单调的队列(增或减)每次移到新的一格就会把队尾和当前做比较,不满足单调性就一直去掉队尾,一直到满足为止,因为有单调性,队首就是答案。除了队列q数组,还有一个p数组,用来放队内元素在原序列中的下标。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf=1<<30; const int maxn=1e6+7; int a[maxn],p[maxn],q[maxn]; int n,k; void ask_min(){ memset(p,0,sizeof(p)); memset(q,0,sizeof(q)); int tail=1,head=0; for(int i=1;i<=n;i++){ while(head<=tail&&q[tail]>=a[i])tail--; q[++tail]=a[i];p[tail]=i; while(p[head]<=i-k)head++; if(i>=k)printf("%d "

基于深度学习的目标检测

馋奶兔 提交于 2019-11-26 23:17:37
普通的深度学习监督算法主要是用来做分类,如图1(1)所示,分类的目标是要识别出图中所示是一只猫。而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛以及实际的应用中,还包括目标定位和目标检测等任务。其中目标定位是不仅仅要识别出来是什么物体(即分类),而且还要预测物体的位置,位置一般用边框(bounding box)标记,如图1(2)所示。而目标检测实质是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位。比如对图1(3)进行目标检测,得到的结果是好几只不同动物,他们的位置如图3中不同颜色的框所示。 (1)目标分类 (2)目标定位 (3)目标检测 图1 目标分类、定位、检测示例 简单来说,分类、定位和检测的区别如下: 分类:是什么? 定位:在哪里?是什么?(单个目标) 检测:在哪里?分别是什么?(多个目标) 目标检测对于人类来说并不困难,通过对图片中不同颜色模块的感知很容易定位并分类出其中目标物体,但对于计算机来说,面对的是RGB像素矩阵,很难从图像中直接得到狗和猫这样的抽象概念并定位其位置,再加上有时候多个物体和杂乱的背景混杂在一起,目标检测更加困难。但这难不倒科学家们,在传统视觉领域,目标检测就是一个非常热门的研究方向,一些特定目标的检测,比如人脸检测和行人检测已经有非常成熟的技术了

P1886 滑动窗口

最后都变了- 提交于 2019-11-26 21:20:32
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 输入格式: 输入一共有两行,第一行为n,k。 第二行为n个数(<INT_MAX). 输出格式: 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 输入样例 8 3 1 3 -1 -3 5 3 6 7 输出样例 -1 -3 -3 -3 3 3 3 3 5 5 6 7 说明 50%的数据,n<=10^5 100%的数据,n<=10^6 思路: 单调队列了解一下 单调队列模板题 代码(读入输出不需优化): #include<cmath> #include<stack> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=1000010; int n,k,a[N]; int q[N],f[N]; int main() { scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) scanf("%d",&a[i]);

滑动窗口【单调队列】

筅森魡賤 提交于 2019-11-26 12:31:53
给定一个大小为n≤106的数组。 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。 您只能在窗口中看到k个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为[1 3 -1 -3 5 3 6 7],k为3。 窗口位置 最小值 最大值 [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 您的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。 输入格式 输入包含两行。 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长度。 第二行有n个整数,代表数组的具体数值。 同行数据之间用空格隔开。 输出格式 输出包含两个。 第一行输出,从左至右,每个位置滑动窗口中的最小值。 第二行输出,从左至右,每个位置滑动窗口中的最大值。 输入样例: 8 3 1 3 -1 -3 5 3 6 7 输出样例: -1 -3 -3 -3 3 3 3 3 5 5 6 7 窗口可以用队列维护, 3,-1,-3,最小值为-3,只要有-3存在,3,-1就不会被用到,删去; 成为一个单调递增的队列,对头为最小值 #include<iostream>

Spark Streaming 实例:滑动窗口Window中的数据进行累加 —— 读取Kafka数据实现最近一小时能耗数据统计

痴心易碎 提交于 2019-11-26 06:59:03
数据格式如下:电表标签+每15min的用电量(度) MT_001:0;MT_002:5;MT_003:0;MT_004:40;MT_005:20; MT_001:0;MT_002:5;MT_003:0;MT_004:30;MT_005:15; MT_001:0;MT_002:4;MT_003:0;MT_004:30;MT_005:13; MT_001:0;MT_002:4;MT_003:0;MT_004:31;MT_005:14; MT_001:0;MT_002:4;MT_003:0;MT_004:29;MT_005:13; 实际数据是有370个电表,一个月的数据采样周期15min,可以到这里下载: https://download.csdn.net/download/Ahuuua/11996754 目标:统计每个电表最近一小时的耗电量 import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.spark.SparkConf; import org.apache.spark.api.java.function.*; import org.apache.spark

一道Google算法题:给一个长度为2N的非负整数数组arr。现在每次删除最左端或最右端的元素,重复N次为止。请返回被删掉的数字之和最大是多少。

时光毁灭记忆、已成空白 提交于 2019-11-25 20:59:09
题目链接: https://www.nowcoder.com/discuss/205633?type=2&order=3&pos=184&page=1 题目来源:牛客网 题目描述 2、给一个长度为2N的非负整数数组arr。现在每次删除最左端或最右端的元素,重复N次为止。请返回被删掉的数字之和最大是多少。 例: [1,2,3,4] => 4 + 3 = 7 [1,100,2,8] => 1 + 100 = 101 [98, 52, 67, 89]=> 98+89 = 187 解题思路:滑动窗口 学过计算机网络的人应该都知道有滑动窗口这个概念。这里设置一个长度为N的滑动窗口,假设有 [a, b, c, d, e, f , g, h,i]。算法步骤如下: 1、滑动窗口取左区间,滑动窗口的内容为[a, b, c, d],max=a+b+c+d 2、滑动窗口移动一个位置,此时滑动窗口的内容为[i, a, b, c], 作如下判断: tmp = max - d + i ; if tmp > max : max = tmp 3、重复步骤2,直至滑动窗口为[f, g, h, i], 此时的max是解。 算法实现 # include <stdio.h> unsigned long long slide_window ( int * arr , unsigned int size ) {