LeetCode-697. Grado de una matriz [simple] -Análisis y código (Java)

LeetCode —— 697. Grado de una matriz [Grado de una matriz] [Simple] —— Análisis y código [Java]

1. Tema

Dada una matriz de números enteros no vacíos que solo contiene números no negativos, el grado de la matriz se define como el valor máximo de cualquier elemento en el grupo de exponentes.
Su tarea es encontrar el subarreglo contiguo más corto en nums con el mismo grado que nums y devolver su longitud.

Ejemplo 1:

输入:[1, 2, 2, 3, 1]
输出:2
解释:
输入数组的度是2,因为元素1和2的出现频数最大,均为2.
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组[2, 2]的长度为2,所以返回2.

Ejemplo 2:

输入:[1,2,2,3,1,4,2]
输出:6

inmediato:

  • nums.length está en el rango de 1 a 50.000.
  • nums [i] es un número entero en el rango de 0 a 49,999.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/degree-of-an-array Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos, análisis y código

1. Tabla hash

(1) Pensando

Diseñe 3 matrices hash para registrar el número de ocurrencias de cada número, la posición de la primera ocurrencia y la posición de la última ocurrencia.
Atraviese el número de ocurrencias de cada número para obtener el grado máximo, calcule la longitud de la submatriz continua del número correspondiente al grado, y el valor mínimo es la solución.

(2) Código

class Solution {
    
    
    public int findShortestSubArray(int[] nums) {
    
    
        int n = nums.length, size = 50000;
        int[] time = new int[size], first = new int[size], last = new int[size];
        Arrays.fill(time, 0);
        for (int i = 0; i < n; i++) {
    
    //记入哈希表
            if (time[nums[i]]++ == 0)
                first[nums[i]] = i;
            last[nums[i]] = i;
        }
        //寻找最大度数的最短子数组长度
        int maxTime = 0, ans = Integer.MAX_VALUE;
        for (int t : time)
            maxTime = Math.max(maxTime, t);
        for (int i = 0; i < size; i++) {
    
    
            if (time[i] == maxTime)
                ans = Math.min(ans, last[i] - first[i] + 1);
        }
        return ans;
    }
}

(3) Resultados

Tiempo de ejecución: 16 ms, superando al 86,49% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 42,9 MB, superando al 30,94% de los usuarios en todas las presentaciones de Java.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/114108111
Recomendado
Clasificación