medianSlidingWindow- mediana de la ventana corrediza

Descripción del Título

La mediana es el número en el medio de la secuencia ordenada. Si el tamaño de la secuencia es par, no hay un número intermedio; en este caso, la mediana es el promedio de los dos números intermedios.

P.ej:

[2,3,4], la mediana es 3
[2,3], la mediana es (2 + 3) / 2 = 2.5

Dada una matriz de números, hay una ventana de tamaño k que se desliza desde el extremo izquierdo al extremo derecho. Hay k números en la ventana y cada vez que la ventana se mueve 1 bit hacia la derecha. Su tarea es encontrar la
mediana de los elementos en la nueva ventana cada vez que se mueve la ventana y generar una matriz de ellos.

Ejemplo:

Números dados = [1,3, -1, -3,5,3,6,7] y k = 3.

Posición de la ventana mediana


[1 3 -1] -3 5 3 6 7 1
1 [3-1-3] 5 3 6 7-1
1 3 [-1-3 5] 3 6 7-1
1 3-1 [-3 5 3 ] 6 7 3
1 3 -1-3 [5 3 6] 7 5
1 3 -1-3 5 [3 6 7] 6

Por lo tanto, se devuelve la matriz mediana de la ventana deslizante [1, -1, -1,3,5,6].

inmediato:

Puede asumir que k siempre es válido, es decir: k siempre es menor que el número de elementos en la matriz de entrada no vacía.
Las respuestas que estén dentro de 10 ^ -5 del valor real se considerarán como la respuesta correcta.

Ideas para resolver problemas

Ordene los elementos en la ventana, encuentre la mediana

Demostración de código

class Solution {
    
    
    public double[] medianSlidingWindow(int[] nums, int k) {
    
    
          //返回数组的长度
        double[] res=new double[nums.length-k+1];
        int[] copy = Arrays.copyOf(nums, k);
        Arrays.sort(copy);
        if(k%2!=0)
        {
    
    
            res[0]=copy[k/2];
            for(int i=k;i<nums.length;i++)
            {
    
    

                for(int j=0;j<k;j++)
                {
    
    
                    if(copy[j]==nums[i-k])
                    {
    
    
                        copy[j]=nums[i];
                        Arrays.sort(copy);
                        res[i-k+1]=copy[k/2];
                        break;
                    }
                }

            }
        }
        else
        {
    
    
            res[0]=((double) copy[k/2-1]+(double) copy[k/2])*1.0/2;
            for(int i=k;i<nums.length;i++)
            {
    
    
                for(int j=0;j<k;j++) {
    
    

                    if (copy[j] == nums[i - k]) {
    
    
                        copy[j] = nums[i];
                        Arrays.sort(copy);
                        res[i - k + 1] = ((double) copy[k / 2 - 1] + (double) copy[k / 2]) * 1.0 / 2;
                        break;
                    }
                }
            }
        }
        return res;
    }
}

efecto

La
respuesta de información fue exitosa:
tiempo de ejecución: 272 ms, derrotando al 14.85% de los usuarios de Java
Consumo de memoria: 40.6 MB, derrotando al 52.01% de los usuarios de Java

código ps simplificado


class Solution {
    
    
    public double[] medianSlidingWindow(int[] nums, int k) {
    
    
          //返回数组的长度
        double[] res=new double[nums.length-k+1];
        int[] copy = Arrays.copyOf(nums, k);
        Arrays.sort(copy);

            res[0]=  k%2==1 ?  copy[k/2] : ((double)copy[k/2]+(double)copy[k/2-1])*1.0/2;
            for(int i=k;i<nums.length;i++)
            {
    
    

                for(int j=0;j<k;j++)
                {
    
    
                    if(copy[j]==nums[i-k])
                    {
    
    
                        copy[j]=nums[i];
                        Arrays.sort(copy);
                        res[i-k+1]=k%2==1 ?  copy[k/2] : ((double)copy[k/2]+(double)copy[k/2-1])*1.0/2;
                        break;
                    }
                }

            }

        return res;
    }
}

Supongo que te gusta

Origin blog.csdn.net/tangshuai96/article/details/113591752
Recomendado
Clasificación