滑动窗口

关于使用滑动窗口解决数组的一系列问题

匿名 (未验证) 提交于 2019-12-03 00:29:01
在使用滑动窗口之前,我们需要知道什么是滑动窗口,它又能帮助我们解决什么样的问题? 为了理解滑动窗口是什么,我们先来看一个简单的例子,难度指数:简单 这道题在leetcode上也能找到:209 Mininum Size Subarray Sum ( l < arr. length if (sum < s && r+ 1 < arr. length else if min (res, r-l+ 1 if (res == arr. length + 1 ) return 0 ; return res; } public static void main(String[] args) { int [] nums = { 2 , 3 , 1 , 2 , 4 , 3 }; int s = 7 ; System. out .println( minSubArrayLen (s , nums)); }} 现在我们来看看下一个例子,难度:一般 可以看出,这道题和上一道思想上没有不同,都是创建一个滑动窗口来进行遍历,不过要注意的是这里使用的是一个freq[256]的整形数组来记录滑动窗口中字符的频率,而右边界r++,左边界l++的判断条件也不一样。可以总结出一个模板: int l = 0 , r = - 1 ; while ( l<s.length() ){ if else 创建一个滑动窗口

滑动窗口

匿名 (未验证) 提交于 2019-12-02 23:57:01
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

剑指:滑动窗口的最大值

匿名 (未验证) 提交于 2019-12-02 23:55:01
题目描述 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 [2, 3, 4, 2, 6, 2, 5, 1] [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 || size>num.length){ return new ArrayList

cogs 495. 滑动窗口 单调队列

匿名 (未验证) 提交于 2019-12-02 23:55:01
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; deque <int> q ; #include

LeetCode-239-滑动窗口最大值

匿名 (未验证) 提交于 2019-12-02 23:52:01
双端队列实现: class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int>vec; deque<int>q; for(int i=0;i<nums.size();i++) { if(!q.empty()&&q.front()==i-k) //如果队列不为空并且队列头下标是上一个滑窗的最左端下标值,则弹出 q.pop_front(); while(!q.empty()&&nums[q.back()]<nums[i]) //如果队列不为空并且队列尾下标所在的nums值小于当前nums值,则一直弹出,保证队列头所在的下标是最大值 q.pop_back(); q.push_back(i); //准备工作做完之后,加入该下标的值 if(i>=k-1) vec.push_back(nums[q.front()]); //从第k个之后,vec弹入队列头的下标所在的nums值,因为此时值是最大的。 } return vec; } }; 文章来源: https://blog.csdn.net/tougui3749/article/details/97376089

Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

匿名 (未验证) 提交于 2019-12-02 23:49:02
今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix、Ribbon以及Feign它们三者之间在处理微服务调用超时从而触发熔断降级的关系是什么? 我们知道在Spring Cloud微服务体系下,微服务之间的互相调用可以通过Feign进行声明式调用,在这个服务调用过程中Feign会通过Ribbon从服务注册中心获取目标微服务的服务器地址列表,之后在网络请求的过程中Ribbon就会将请求以负载均衡的方式打到微服务的不同实例上,从而实现Spring Cloud微服务架构中最为关键的功能即服务发现及客户端负载均衡调用。 另一方面微服务在互相调用的过程中,为了防止某个微服务的故障消耗掉整个系统所有微服务的连接资源,所以在实施微服务调用的过程中我们会要求在调用方实施针对被调用微服务的熔断逻辑。而要实现这个逻辑场景在Spring Cloud微服务框架下我们是通过Hystrix这个框架来实现的。 调用方会针对被调用微服务设置调用超时时间,一旦超时就会进入熔断逻辑,而这个故障指标信息也会返回给Hystrix组件,Hystrix组件会根据熔断情况判断被调微服务的故障情况从而打开熔断器,之后所有针对该微服务的请求就会直接进入熔断逻辑,直到被调微服务故障恢复,Hystrix断路器关闭为止。 Hystrix

LeetCode 239. 滑动窗口最大值

匿名 (未验证) 提交于 2019-12-02 23:48:02
返回滑动窗口最大值。 示例: 输入: 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 注意: 进阶: 你能在线性时间复杂度内解决此题吗? 算法:我们当然可以在O(n)时间复杂度解决,我们的做法是,遍历一趟数组,维护一个单调的双端队列。当队头元素小于等于下一个元素时,我们干掉队头元素并把下一个元素加入到双端队列的队头,过程中维护队列的长度不超过K即可。 class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { deque<int>q; vector<int>res; for(int i=0,j=0;i<nums.size();i++){ while(!q.empty()&&nums[q.front()]<=nums[i])q.pop_front(); q.push_front(i);

滑动窗口算法(思想)

匿名 (未验证) 提交于 2019-12-02 23:47:01
题目: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 子串和串中字符的对比,只要出现相同字符都算重复,肯定要用到嵌套循环。 如果暴力枚举,每个长度的子串都拿出来做自检,时间复杂度会比较高。 使用滑动窗口的思想,对错误信息进行合理利用,可以有效减少执行次数。 C语言解法: int lengthOfLongestSubstring(char * s){ int i = 0, j = 0; int maxlen = 0; int curlen = 0; int len = strlen(s); if (len == 0) return 0; for (; j < len && len - i > maxlen; j++) { curlen++; for (int k = i; k <= j; k++) { if (s[k] == s[j + 1]) { if (curlen > maxlen) maxlen = curlen; i = k + 1; curlen = j - i + 1; break; } } } if (curlen > maxlen) return curlen; else return maxlen; } 滑动窗口初听觉得抽象模糊,其实拿卷尺一对比很好理解 一个字符串

Flink中的Time与Window

匿名 (未验证) 提交于 2019-12-02 23:43:01
一、Time 在Flink的流式处理中,会涉及到时间的不同概念 Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳 Ingestion Time:是数据进入Flink的时间 Processing Time:是每一个执行基于时间操作的算子的本地系统时间,与机器相关,默认的时间属性就是Processing Time。 例如一条日志进入Flink的时间为2017-11-12 10:00:00.123 到达window的系统时间为 2017-11-12 10:00:01.234,日志内容如下: 2017-11-02 18:37:15.624 INFO Fair over to rm2 对于业务来说,要统计1min内的故障日志个数,哪个时间是最有意义的?----- eventTime,因为我们要根据日志的生成时间进行统计。 如果要想聚合,不可能对无解数据流进行聚合。 二、Window 1、streaming流式计算是一种被设计用于处理处理无限数据集的数据处理引擎,而无限数据集是指一种不断增长的本质上无限的数据集,而window是一种切割无限数据为有限块进行处理的手段。 Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的"buckets"桶

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

匿名 (未验证) 提交于 2019-12-02 22:51:30
1. 题目描述 返回滑动窗口中的最大值。 示例: 输入: 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 提示: 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): silidingWin = nums[i:i + k] ans.append(max(silidingWin)) return ans 来源:博客园 作者: 有梦放飞 链接:https://www.cnblogs.com/xiaotongtt