360. Sliding Window Median

Code(Language:C++) (Judger:cloudjudge-cluster-5)
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

Popular posts from this blog

算法的比较