La suma de todos los subarreglos de longitud impar del algoritmo

Dada una matriz de enteros positivos arr, calcule la suma de todas las posibles submatrices de longitud impar.

La submatriz se define como una subsecuencia continua en la matriz original. Devuelva la suma de todos los subarreglos de longitud impar en arr.

Ejemplo 1:

Entrada: arr = [1,4,2,5,3]

Salida: 58

Explicación: Todas las submatrices de longitud impar y su suma son:

La submatriz de longitud 1 tiene [1], [4], [2], [5], [3] y el resultado de la suma es 15

La submatriz de longitud 3 tiene [1,4,2], [4,2,5], [2,5,3], el resultado de la suma es 7 + 11 + 10 = 28

La submatriz de longitud 5 tiene [1,4,2,5,3], el resultado de la suma es 15

Sumamos todos los valores para obtener 15 + 28 + 15 = 58

Ejemplo 2:

Entrada: arr = [1,2]

Salida: 3

Explicación: solo hay 2 submatrices de longitud 1, [1] y [2]. Su suma es 3.

Algoritmo 1: atravesar y sumar según los requisitos del tema

int sumOddLengthSubarrays(int* arr, int arrSize)  //效率较低

{
    
      

    int sum = 0;  

    for(int i=1;i<=arrSize;i+=2)//遍历所有奇数的子长度,如1,3,5,...,2n+1  

    {
    
      

        for(int j=0;j<arrSize-i+1;j++)//每一组子数组  

        {
    
      

            for(int k=0;k<i;k++)//把子数组的所有数字相加  

            {
    
      

                sum += arr[j+k];  

            }  

        }  

    }  

    return sum;  

}

Algoritmo 2: calcula la cantidad de ocurrencias de cada número y luego súmalos
para calcular gradualmente la suma de las submatrices de acuerdo con el significado de la pregunta. Se encuentra que cada número aparece varias veces y se calcula varias veces, por lo que Pienso si puede calcular directamente el número de ocurrencias de cada número. La idea es la siguiente:

1. Tome cualquier elemento con el índice i (i + 1) de la matriz

2. Puede haber elementos 0 ~ i a la izquierda, esquemas i + 1 en total, entre los cuales (i + 1) / 2 son números impares e i / 2 + 1 son números pares.

3. A la derecha, puede tomar elementos 0 ~ (ni-1), hay ni tipos de esquemas, (ni) / 2 son números impares y (n-i + 1) / 2 son números pares

4. El subarreglo compuesto debe cumplir las condiciones: izquierda + propia + derecha = número impar, por lo tanto, izquierda impar -> derecha impar, izquierda par -> derecha par

5. Entonces, el número de apariciones de arr [i] es lOdd X rOdd + lEven X rEven, que es impar a la izquierda X impar a la derecha + par a la izquierda X par a la derecha

int sumOddLengthSubarrays(int* arr, int arrSize)  

{
    
      

    int res = 0;  

    int lEven,lOdd,rEven,rOdd;//左偶数,左奇数,右偶数,右奇数  

    for(int i=0;i<arrSize;i++)  

    {
    
      

        lOdd = (i+1)/2;  

        lEven = i/2 + 1;  

        rOdd = (arrSize-i)/2;  

        rEven = (arrSize-i+1)/2;  

        res += (lOdd*rOdd + lEven*rEven) * arr[i];  

    }  

    return res;  

}  

Supongo que te gusta

Origin blog.csdn.net/Gunanhuai/article/details/109263561
Recomendado
Clasificación