Method 2 One TreeSet

not finished yet

class Solution {
    private TreeSet<Element> window;
    private Element median;
    public double[] medianSlidingWindow(int[] nums, int k) {
        this.window = new TreeSet<>();
        double[] result = new double[nums.length - k + 1];
        for (int i = 0; i < nums.length; i++) {
            if (i >= k) {
                delete(nums[i - k], i - k);
            }
            add(nums[i], i);
            if (i >= k - 1) {
                result[i - k + 1] = findMedian();
            }
        }
        return result;
    }
    private void add(int value ,int index) {
        Element ele = new Element(value, index);
        window.add(ele);
        if (median == null) {
            median = new Element(value, index);
        }
        // udpate median
        if (ele.compareTo(median) <= 0) {
            if (window.size() % 2 == 0) {
                median = window.floor(median);
            }
        }
        else {
            if (window.size() % 2 == 1) {
                median = window.ceiling(median); // 这个index 对么?
            }
        }
 
    }
    private void delete(int value, int index) {
        Element ele = new Element(value, index);
        window.remove(ele);
        // udpate median
        if (ele.compareTo(median) <= 0) {
            if (window.size() % 2 == 1) {
                median = window.ceiling(median);
            }
        }
        else {
            if (window.size() % 2 == 0) {
                median = window.floor(median); // 这个index 对么?
            }
        }
    }
    private double findMedian() {
        double result = 0.0;
        if (window.size() % 2 == 0) {
            result = (double) median.value /2.0 + window.ceiling(median).value /2.0;
        }
        else {
            result = (double) median.value;
        }
        return result;
    }

    class Element implements Comparable<Element> {
        int value;
        int index;
        public Element(int val, int idx) {
            this.value = val;
            this.index = idx;
        }
        @Override
        public int compareTo(Element that) {
            int result = Integer.compare(this.value, that.value);
            if (result == 0) {
                return Integer.compare(this.index, that.index);
            }
            return result;
        }
    }
}
```

Last updated