滑动窗口

【leetcode - 59-I】滑动窗口的最大值 -Easy

和自甴很熟 提交于 2020-04-04 17:58:01
给定一个数组 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 提示: 你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。 【original】 思路:暴力解法,遍历得到每个窗口的最大值 class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: stack = [] if not nums: return [] def maxx(x): a = x[0] for i in x: if i>=a: a = i return a for i in range(0,len(nums)-k+1): stack.append(maxx(nums[i:i+k])) return

480 Sliding Window Median 滑动窗口中位数

天大地大妈咪最大 提交于 2020-03-27 18:33:51
详见:https://leetcode.com/problems/sliding-window-median/description/ C++: class Solution { public: vector<double> medianSlidingWindow(vector<int>& nums, int k) { vector<double> res; multiset<double> ms(nums.begin(), nums.begin() + k); auto mid = next(ms.begin(), k / 2); for (int i = k; ; ++i) { res.push_back((*mid + *prev(mid, 1 - k % 2)) / 2); if (i == nums.size()) { return res; } ms.insert(nums[i]); if (nums[i] < *mid) { --mid; } if (nums[i - k] <= *mid) { ++mid; } ms.erase(ms.lower_bound(nums[i - k])); } } }; 参考:http://www.cnblogs.com/grandyang/p/6620334.html 来源: https://www.cnblogs.com

滑动窗口的中位数 · Sliding Window Median

女生的网名这么多〃 提交于 2020-03-27 18:31:10
[抄题]: 给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的中位数。(如果数组个数是偶数,则在该窗口排序数字后,返回第 N/2 个数字。) 对于数组 [1,2,7,8,5] , 滑动大小 k = 3 的窗口时,返回 [2,7,7] 最初,窗口的数组是这样的: [ | 1,2,7 | ,8,5] , 返回中位数 2 ; 接着,窗口继续向前滑动一次。 [1, | 2,7,8 | ,5] , 返回中位数 7 ; 接着,窗口继续向前滑动一次。 [1,2, | 7,8,5 | ] , 返回中位数 7 ; [暴力解法]: 时间分析: 空间分析: [思维问题]: 不理解两个heap和窗口的大小关系:把窗口容量全扔进来,具体分到哪个格子另当别论 体会到了treemap相对于heap的优越性:想 romove 哪个点是随便的。注意接口、实现都不是PQ,是 treeset 而且树状的题想想里面装的是 node 还是数字 [一句话思路]: 窗口 移动就是加一个元素、减一个元素,用俩函数实现,所以可以放在maxheap minheap中 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: 窗口满了之后romove第一个点,i - k + 1,不是第i个点,写习惯了就错了

Leetcode 480.滑动窗口中位数

。_饼干妹妹 提交于 2020-03-27 18:28:03
滑动窗口中位数 中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 = 2.5 给出一个数组 nums,有一个大小为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。 例如: 给出 nums = [1,3,-1,-3,5,3,6,7],以及 k = 3。 窗口位置 中位数 --------------- ----- [1 3 -1] -3 5 3 6 7 1 1 [3 -1 -3] 5 3 6 7 -1 1 3 [-1 -3 5] 3 6 7 -1 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] 6 因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]。 提示: 假设k是合法的,即:k 始终小于输入的非空数组的元素个数. 解题思想 题目会给一个数组,和一个滑动窗口的大小K,让你找出当这个窗口滑动的过程中,这个K的窗口内的中位数分别是多少? 最naive的方式就是在k个窗口内排序就好,这里不解释(因为开销很大啊,(n-k+1) * (k*log(k)

洛谷 P1886 滑动窗口(单调队列)

旧街凉风 提交于 2020-03-25 21:52:50
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 输入输出格式 输入格式: 输入一共有两行,第一行为n,k。 第二行为n个数(<INT_MAX). 输出格式: 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 输入输出样例 输入样例#1: 8 3 1 3 -1 -3 5 3 6 7 输出样例#1: -1 -3 -3 -3 3 3 3 3 5 5 6 7 说明 50%的数据,n<=10^5 100%的数据,n<=10^6 解题思路 先理解文意:对于给定一个长度为n的序列,找出所有长为k的区间的最大值(最小值)。 首先很多人会想到,枚举每一个长为k的区间,然后遍历一遍,找到最大值(最小值),这样的时间复杂度是o(nk)的, 显然超时 。 所以我们需要换一种思路。 单调队列 :单调队列就是一个一直保持单调性(递增或递减)的长度最大为k的双端队列。 我们维护这样一个单调队列,使它队首元素即为要求的最大值(最小值)。 所以本题的核心是:怎样维护一个单调队列。

滑动窗口的最大值

浪子不回头ぞ 提交于 2020-03-25 21:43:22
滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。 使用一个队列做小标索引, 保存窗内最大值的下标, 还要判断这个索引是否在当前窗内 class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> ret; if ((num.size() >= size ) && (size > 0)) { deque<int> index; // 用于存放下标的索引 for (auto i = 0; i < size; i++) { // 存放前size个中的最大值 // 重复元素只存储一份, 所以用大于等于号 while ((! index.empty(

滑动窗口中的最大值

主宰稳场 提交于 2020-03-25 21:42:54
思路:把有可能成为滑动窗口最大值的数值存入一个两端开口的队列deque,在队列里存入数字在数组里的下标,而不是数值,当一个数字的下标与当前处理的数字的下标之差大于或者等于滑动窗口的大小时,这个数字已经从窗口中滑出,可以从队列中删除了。 class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> maxInWin; if(num.size()>=size && size>=1) { deque<int> index; //先处理第一个窗口 for(int i=0;i<size;++i) { //队列不为空,并且当前值比队列最后一个值对应的数大时,弹出最后一个数 while(!index.empty() && num[i]>=num[index.back()]) index.pop_back(); //当队列中没有比当前值大时,压入队列中 index.push_back(i); } for(int i=size;i<num.size();++i) { //队首一直为窗口最大值 maxInWin.push_back(num[index.front()]); while(!index.empty() && num[i]>=num

Python之滑动窗口

给你一囗甜甜゛ 提交于 2020-03-25 21:41:29
需求 对于一个数组array = ["n","v","l","f",...,"y","c","k"]; input 当前位置 index 数组的长度 arraySize 基于当前位置,(前/后)滑动窗口的元素数目 windowSize 即 滑动窗口(假定:包含当前元素 array[idx]) 总长:2*windowSize+1 output 滑动窗口中的元素下标数组 形如 【中间】idx=3,arraySize=7,windowSzie=2 => [1,2,3,4,5] 【偏前】idx=0,arraySize=7,windowSzie=2 => [5,6,0,1,2] 【偏后】idx=6,arraySize=7,windowSzie=2 => [4,5,6,1,0] 实现思路 [1] 循环队列 [2] 充分利用模运算的特点:最左边下标 (idx-windowSize)%arraySize 与 最后边下标(idx+windowSize)%arraySize可计算出来 源码 一 利用思路2,节省更多计算资源。 目前存在一种bug,比如 (2,10,3) class CollectionUtil: def window(idx,arraySize,windowSize,containsCenterIdx=True): # 实现滑动窗口 """ 获得当前位置的滑动窗口[元素的下标数组] -

滑动窗口的最大值-剑指Offer

混江龙づ霸主 提交于 2020-03-25 21:32:58
滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。 思路 我们可以用一个队列来存储每个窗口的数,然后选出最大的,不过这样代价有点大 其实不必每个窗口的每个数都存下来,我们用一个双向队列deque来存储,注意:我们在这存的是数组元素的索引 如果新来的值比队列尾部的数小,那就追加到后面,因为它可能在前面的最大值划出窗口后成为最大值 如果新来的值比尾部的大,那就删掉尾部(因为有更大的在后面,所以它不会成为最大值,划出也是它先划出,不影响最大值),再追加到后面,循环下去直到小于 如果追加的值比的索引跟队列头部的值的索引超过窗口大小,那就删掉头部的值 其实这样每次队列的头都是最大的那个 代码 import java.util.ArrayDeque; import java.util

剑指offer---滑动窗口的最大值

冷暖自知 提交于 2020-03-25 21:30:31
我开始的方法。。。跟原始人一样 还是太菜 class Solution { public: int FindMax(const vector<int> &a, int start, int end) { int MaxNum = -100000; for (int i = start; i <= end; ++i) { MaxNum = max(MaxNum, a[i]); } return MaxNum; } vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> re; int in_size = num.size(); if (size <= 0) return re; if (size > 0 && size < in_size) { for (int i = 0; i <= (in_size - size); ++i) { int temp = FindMax(num, i, i + size - 1); re.push_back(temp); } return re; } else if(size==in_size) { int temp=FindMax(num,0,in_size-1); re.push_back(temp); return re; } else