maxSlidingWindow: el valor máximo de la ventana deslizante

Requisitos de la asignatura

Dada una matriz de números enteros, hay una ventana deslizante de tamaño k que se mueve desde el lado más a la izquierda de la matriz hasta el lado más a la derecha de la matriz. Solo puede ver los k números en la ventana deslizante. La ventana deslizante solo se mueve una posición hacia la derecha a la vez.

Devuelve el valor máximo en la ventana deslizante.

Ejemplo 1:

Entrada: nums = [1,3, -1, -3,5,3,6,7], k = 3
Salida: [3,3,5,5,6,7]
Explicación:
La posición máxima del deslizamiento ventana


[1 3 -1] -3 5 3 6 7 3
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 5
1 3-1-3 [5 3 6] 7 6
1 3-1-3 5 [3 6 7] 7

Ejemplo 2:

Entrada: nums = [1], k = 1
Salida: [1]

Ejemplo 3:

Entrada: nums = [1, -1], k = 1
Salida: [1, -1]

Ejemplo 4:

Entrada: nums = [9,11], k = 2
Salida: [11]

Ejemplo 5:

Entrada: nums = [4, -2], k = 2
Salida: [4]

inmediato:

1 <= núm. Longitud <= 105-104 <=
núm. [I] <= 104
1 <= k <= núm. Longitud

Ideas para resolver problemas

1. Primero determine el número de valores devueltos
2. Encuentre el
valor máximo de los primeros k números 3.1 Si el valor máximo es el primer número, empuje la ventana al siguiente número y encuentre el valor máximo nuevamente
3.2 Si el valor máximo no el primero Si empuja la ventana al siguiente número, solo necesita juzgar cuál es mayor que el número más grande y el siguiente número.
4 Devolver el resultado
ps (búsqueda de valor máximo si hay múltiples valores máximos para k números, la última posición es el valor máximo, luego reducir la cantidad de cálculo)

Código de resolución de problemas

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] res=new int[nums.length-(k-1)];//用来存放结果
        int[] max1 = findMax(nums, 0, k);//找出最大值,和最大值的位置
        int max= max1[0];//最大值存入max变量中
        res[0]=max;//结果数组第一个值确定下来
         int flag =k;
         while (flag <nums.length)循环之后变量,找出每一回推的最大值
         {
             if(max1[1]==flag-k)//如果最大值是第一个值,则重新找最大值
             {
                 max1=findMax(nums,flag-k+1,k);
                 max=max1[0];
                 res[flag -k+1]=max;
             }
            else if(nums[flag]>=max)
            {
                res[flag -k+1]=nums[flag];
                max=nums[flag];
            }
            else
             {
                 res[flag -k+1]=max;
             }

             flag++;
         }
         return  res;
    }
    public int[] findMax(int[] nums,int s,int k)
    {
        int r =-1;//用来判断是否是第一个数
        int maxElem=Integer.MIN_VALUE;//找出最大值
        for (int i = s; i < s+ k; i++) {
            if(maxElem<=nums[i])
            {
                maxElem=nums[i];
                r =i;
            }

        }
        return new int[]{maxElem, r};
    }
}

efecto

La
respuesta de información fue exitosa:
tiempo de ejecución: 773 ms, derrotando al 5.06% de los usuarios de Java
Consumo de memoria: 59.3 MB, derrotando al 8.71% de los usuarios de Java

Supongo que te gusta

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