Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
1.1 kB
4
Indexable
Never
int numDistinctSubarray(vector<int> array) {
   int output = 0;
   map<int, int> maxSubarray;
   // aunque el codigo dentro del loop parece O(N^2) en realidad estas recorriendo 
   // cada elemento solo 2 veces por lo que sigue siendo O(N) la complejidad de for.
   for (int i = 0; i < array.size(); ) {
      int j = i + 1;
      while (j < array.size() && array[j-1] + 1 == array[j]) j++;
      // el subarray [i ... j) son numeros consecutivos
      
      // calcular los subarrays empezando en cada posicion i
      while (i < j) {
         int start = array[i];
         int N = j - i;
         if (maxSubarray[start] < N) {
            int totales = N; 
            int duplicados = maxSubarray[start];
            
            output += totales - duplicados;
            maxSubarray[start] = N;
         } else {
            // no hay nada nuevo que contar, ya que anteriormente se habian contado
         }
         i++;
      }
      
      // i termina siendo igual a j, por el que para la siguiente 
      //iteracion el otro subarray empieza donde este termina
   }
   

   return output;
}
Leave a Comment