[Leetcode] 697. Grado de una matriz (simulación) [simple]

Enlace

https://leetcode-cn.com/problems/degree-of-an-array/

pérdida de tiempo

Resolución de problemas: 1 h 29 min
Resolución de problemas: 13 min

Título

Dada una matriz de números enteros no vacíos que contiene solo 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.

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.

Ideas

El significado de la pregunta es encontrar la posición del primer elemento en la matriz del elemento con la mayor frecuencia, y la longitud es la diferencia de la posición del primer elemento. Debido a que puede haber más de un elemento con la mayor frecuencia, la pregunta es: devolver la longitud más pequeña entre los elementos con la mayor frecuencia en la matriz.

Defina una estructura (que contenga el valor y la posición del elemento), ordene la estructura por valor del elemento y ordene el valor del elemento por posición. Luego, recorra la matriz de estructura ordenada, los mismos valores de elementos están todos uno al lado del otro, la frecuencia de conteo es muy conveniente, y encuentre los mismos elementos que valen el principio y el final, y reste sus posiciones correspondientes para obtener la longitud.

Complejidad de tiempo: O (nlogn) O (nlogn)O ( n l o g n )

Código AC

class Solution {
    
    
public:
    struct node {
    
    
        int val;
        int pos;
        bool operator < (const node d) const {
    
    
            return (val==d.val)?(pos<d.pos):(val<d.val);
        }
    };
    int findShortestSubArray(vector<int>& nums) {
    
    
        vector<node> valpos;
        int n = nums.size();
        for(int i = 0; i < n; ++i) {
    
    
            valpos.push_back((node){
    
    nums[i], i});
        }
        sort(valpos.begin(), valpos.end());
        
        int maxfreq = 0, minlen = 0;
        int freq = 1, l = valpos[0].pos;
        for(int i = 1; i <= n; ++i) {
    
    
            if(i == n || valpos[i].val != valpos[i-1].val) {
    
    
                if(freq > maxfreq) {
    
    
                    maxfreq = freq;
                    minlen = valpos[i-1].pos-l+1;
                }
                else if(freq == maxfreq) {
    
    
                    minlen = min(minlen, valpos[i-1].pos-l+1);
                }
                freq = 0;
                if(i < n) l = valpos[i].pos;
            }
            freq++;
        }
        
        return minlen;
    }
};

Supongo que te gusta

Origin blog.csdn.net/Krone_/article/details/113884674
Recomendado
Clasificación