Sliding Window Median
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] 6class Solution {
public:
vector<double> medianSlidingWindow(vector<int>& nums, int k) {
multiset<int> window(nums.begin(), nums.begin() + k);
auto mid = next(window.begin(), k/2);
vector<double> medians;
for(int i = k; ; i++){
// push current median
medians.push_back((double(*mid) + *prev(mid, 1 - k%2))/2);
if(i == nums.size()) return medians;
window.insert(nums[i]);
if(nums[i] < *mid) mid --; // no equal here because if inserted value is equal to that of mid, the newly
// inserted one actually comes AFTER the mid.
if(nums[i-k] <= *mid) mid++;
window.erase(window.lower_bound(nums[i-k]));
}
}
};Last updated
Was this helpful?