利口 480 滑動窗口中位數(shù)

題意:給定一個數(shù)組和一個滑動窗口,返回每一個滑動窗口的中位數(shù)

思路:遍歷數(shù)組

  1. 維護(hù)一個最小的treeset,和一個最大的treeset,記錄當(dāng)前節(jié)點(diǎn)的index
  2. 每次根據(jù)奇偶返回當(dāng)前的中位數(shù)

思想:treeset

復(fù)雜度:時間O(nlgk),空間O(k)

class Solution {
    public double[] medianSlidingWindow(int[] nums, int k) {
        TreeSet<Integer> set1 = new TreeSet(new Comparator<Integer>(){
           public int compare(Integer n1, Integer n2) {
               if(nums[n2] == nums[n1])
                   return n1 - n2;
               return Integer.compare(nums[n1], nums[n2]);
           } 
        });
        TreeSet<Integer> set2 = new TreeSet(new Comparator<Integer>(){
           public int compare(Integer n1, Integer n2) {
               if(nums[n2] == nums[n1])
                   return n1 - n2;
               return Integer.compare(nums[n2], nums[n1]);
           } 
        });
        
        double[] res = new double[nums.length - k + 1];
        
        for(int i=0;i<nums.length;i++) {
            if(i>=k) {
                res[i - k] = get(set1, set2, nums);
                remove(i-k, set1, set2, nums);
            }
            add(i, set1, set2, nums);
        }
        res[nums.length - k] = get(set1, set2, nums);
        return res;
    }
    
    void add(int n1, TreeSet<Integer> set1, TreeSet<Integer> set2, int[] nums) {
        if(set1.isEmpty() || nums[n1] >= nums[set1.first()]) {
            set1.add(n1);
        } else {
            set2.add(n1);
        }
        if(set1.size() < set2.size())
            set1.add(set2.pollFirst());
        
        if(set1.size() - set2.size() > 1)
            set2.add(set1.pollFirst());
    }
        
    void remove(int n1, TreeSet<Integer> set1, TreeSet<Integer> set2, int[] nums) {
        if(set1.contains(n1)) {
            set1.remove(n1);
        } else {
            set2.remove(n1);
        }
        if(set1.size() < set2.size())
            set1.add(set2.pollFirst());
        
        if(set1.size() - set2.size() > 1)
            set2.add(set1.pollFirst());
    }
    
    double get(TreeSet<Integer> set1, TreeSet<Integer> set2, int[] nums) {
        if(set1.size() == set2.size()) {
            return ((double)nums[set1.first()] + (double)nums[set2.first()]) / 2;
        } else {
            return (double)nums[set1.first()];
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容