360. Sliding Window Median
class Solution {
public:
/**
* @param nums: A list of integers
* @param k: An integer
* @return: The median of the element inside the window at each moving
*/
vector<int> medianSlidingWindow(vector<int> &nums, int k) {
// write your code here
vector<int> res;
multiset<int> small, large;
for (int i = 0; i < nums.size(); ++i) {
// remove
if (i >= k) {
if (small.count(nums[i - k])) {
small.erase(small.find(nums[i - k]));
}
else if (large.count(nums[i - k])) {
large.erase(large.find(nums[i - k]));
}
}
if (small.size() <= large.size()) {
if (large.empty() || nums[i] <= *large.begin()) {
small.insert(nums[i]); //放入small
}
else {
small.insert(*large.begin());
large.erase(large.begin());
large.insert(nums[i]);
}
} else {
if (nums[i] >= *small.rbegin()) {
large.insert(nums[i]); //放入large
}
else {
large.insert(*small.rbegin());
small.erase(--small.end());
small.insert(nums[i]);//放入small
}
}
if (i >= (k - 1)) {
res.push_back(*small.rbegin());
//else res.push_back(((double)*small.rbegin() + *large.begin()) / 2);
}
}
return res;
}
};
Comments
Post a Comment