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;
}
}