leetcode 480. Sliding Window Median 滑动窗口中位数
来源:互联网 发布:小麦淘商城 知乎 编辑:程序博客网 时间:2024/05/17 15:40
Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.
Examples:
[2,3,4] , the median is 3
[2,3], the median is (2 + 3) / 2 = 2.5
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Your job is to output the median array for each window in the original array.
For example,
Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.
Window position Median
————— —–
[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
Therefore, return the median sliding window as [1,-1,-1,3,5,6].
Note:
You may assume k is always valid, ie: k is always smaller than input array’s size for non-empty array.
题意很简单,和之前的这一道题leetcode 295. Find Median from Data Stream 双优先级队列 + 中位数查找 思路一样,就这么做吧
代码如下:
#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#include <string>#include <climits>#include <algorithm>#include <sstream>#include <functional>#include <bitset>#include <numeric>#include <cmath>using namespace std;class Solution {public: vector<double> medianSlidingWindow(vector<int>& nums, int k) { vector<double> medians; map<int, int> hash; // count numbers to be deleted priority_queue<int, vector<int>> bheap; // heap on the bottom priority_queue<int, vector<int>, greater<int>> theap; // heap on the top int i = 0; // Initialize the heaps while (i < k) { bheap.push(nums[i++]); } for (int count = k / 2; count > 0; --count) { theap.push(bheap.top()); bheap.pop(); } while (true) { // Get median if (k % 2) medians.push_back(bheap.top()); else medians.push_back(((double)bheap.top() + theap.top()) / 2); if (i == nums.size()) break; int m = nums[i - k], n = nums[i++], balance = 0; // What happens to the number m that is moving out of the window if (m <= bheap.top()) { --balance; if (m == bheap.top()) bheap.pop(); else ++hash[m]; } else { ++balance; if (m == theap.top()) theap.pop(); else ++hash[m]; } // Insert the new number n that enters the window if (!bheap.empty() && n <= bheap.top()) { ++balance; bheap.push(n); } else { --balance; theap.push(n); } // Rebalance the bottom and top heaps if (balance < 0) { bheap.push(theap.top()); theap.pop(); } else if (balance > 0) { theap.push(bheap.top()); bheap.pop(); } // Remove numbers that should be discarded at the top of the two heaps while (!bheap.empty() && hash[bheap.top()]) { --hash[bheap.top()]; bheap.pop(); } while (!theap.empty() && hash[theap.top()]) { --hash[theap.top()]; theap.pop(); } } return medians; }};
- [LeetCode] Sliding Window Median 滑动窗口中位数
- leetcode 480. Sliding Window Median 滑动窗口中位数
- Leetcode 480. Sliding Window Median 滑动窗口中的中位数 解题报告
- LeetCode 480. Sliding Window Median
- [LeetCode]480. Sliding Window Median
- [leetcode]480. Sliding Window Median
- leetcode 480. Sliding Window Median
- [LeetCode] Sliding Window Median
- [Leetcode] Sliding Window Maximum 滑动窗口最大值
- [Leetcode] 480. Sliding Window Median 解题报告
- 480. Sliding Window Median
- 480. Sliding Window Median
- 480. Sliding Window Median
- leetcode-480-Sliding Window Median
- Sliding Window 滑动窗口协议
- LeetCode 239. Sliding Window Maximum(滑动窗口最大值)
- sliding window 滑动窗口(单调队列)
- 239. Sliding Window Maximum 滑动窗口最大值
- 算法竞赛中c++使用优势及劣势
- NOIP2010 普及组 蒟蒻的题解报告
- 单通道语音增强之维纳滤波(三)
- 鸟哥的linux私房菜 学习总结----计算机概论(2)
- 用结构体数组写的通讯录
- leetcode 480. Sliding Window Median 滑动窗口中位数
- 数论——素数
- ssl1056-金明的预算方案【dp之有依赖的背包】
- 机器学习面试1000题 1
- 066day(求排列的逆序数的尝试)
- 拦截器
- 浅析Android中MVP及Demo
- ros功能包和机器人
- 高颜值生物信息在线绘图工具