Categorías
Algorithms

LeetCode – Encuentra la mediana del flujo de datos (Java)

La mediana es el valor medio en una lista de números enteros ordenados. Si el tamaño de la lista es par, no hay un valor medio. Entonces, la mediana es la media de los dos valores medios.

Análisis

En primer lugar, parece que la mejor complejidad de tiempo que podemos obtener para este problema es O (log (n)) de add () y O (1) de getMedian (). Es muy probable que esta estructura de datos sea un árbol.

Podemos usar heap para resolver este problema. En Java, el PriorityQueue la clase es un montón de prioridad. Podemos usar dos montones para almacenar la mitad inferior y la mitad superior del flujo de datos. El tamaño de los dos montones difiere como máximo 1.

class MedianFinder {
    PriorityQueue<Integer> minHeap = null;
    PriorityQueue<Integer> maxHeap = null;
 
    /** initialize your data structure here. */
    public MedianFinder() {
        minHeap = new PriorityQueue<>();
        maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
    }
 
    public void addNum(int num) {
        minHeap.offer(num);
        maxHeap.offer(minHeap.poll());
 
        if(minHeap.size()<maxHeap.size()){
            minHeap.offer(maxHeap.poll());
        }
    }
 
    public double findMedian() {
        if(minHeap.size() > maxHeap.size()){
            return minHeap.peek();
        }else {
            return (minHeap.peek()+maxHeap.peek())/2.0;
        }
    }
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *