El 4 de julio de 2022, leetcode verifica una pregunta por día: 118. Triángulo Yang Hui

1. Descripción del tema y requisitos

118. Triángulo Yang Hui - LeetCode

Tema Descripción

Dado un número entero no negativo  numRows, generar antecedentes del Triángulo de Yanghui  numRows .

En el Triángulo Yang Hui, cada número es la suma de los números que están arriba a la izquierda y arriba a la derecha.

ejemplo

Ejemplo 1:

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

Ejemplo 2:

输入: numRows = 1
输出: [[1]]

pista

  • 1 <= numRows <= 30

2. Ideas para resolver problemas

Idea general:

En primer lugar, cuando vea el triángulo de Yang Hui, lo primero en lo que debe pensar es en una matriz bidimensional, porque cada número en el triángulo de Yang Hui es la suma de los números en su parte superior izquierda y superior derecha. Pero cabe señalar que si es un arreglo bidimensional, debe ser un cuadrado, pero parte del espacio no almacena valores, lo que nos obliga a usar la idea de programación dinámica. Primero, solicite un puntero secundario ret de la matriz de punteros. De hecho, este ret es equivalente al nombre de la matriz bidimensional, excepto que apunta a la matriz de punteros de tamaño numRows, que es la matriz que apunta al primer elemento. de cada fila. Luego, asigne numRows a returnSize y returnColumnSizes de acuerdo con las sugerencias en los comentarios. El propósito es devolver matrices numRows al regresar al final, y almacenar elementos i+1 en cada matriz. El siguiente paso es asignar valores a esta matriz bidimensional.Primero, solicite espacios de almacenamiento i+1 para cada fila para almacenar números. returnColumnSizes es un puntero secundario, que apunta a una matriz de enteros con una longitud de numRows, por lo que (returnColumnSizes)[i] se refiere a la cantidad de elementos de almacenamiento en cada fila, que debe ser igual a i+1, y luego la primera fila de cada fila y la última se les asigna un valor de 1, y luego se le suma el valor de la parte superior izquierda y superior derecha de cada elemento. De esta forma, se establece un triángulo Yang Hui.

Tenga en cuenta que returnSize es un puntero de entero, que apunta a un número entero, y solo se usa para registrar el número de filas devueltas, por lo que returnSize=numRows; y returnColumnSizes es un puntero secundario, que apunta a una matriz de enteros de longitud numRows, por lo que (* returnColumnSizes )[i] es para indicar el número de elementos en cada fila, que no tiene nada que ver con el establecimiento del triángulo Yang Hui, pero está relacionado con el resultado final de retorno.

Solo al determinar el tamaño de la matriz devuelta no se desperdiciará espacio.

Pasos específicos:

1. Solicite el espacio de almacenamiento para el triángulo de Yang Hui
2. Asigne la cantidad de matrices devueltas y la cantidad de elementos en la matriz
3. Asigne valores al triángulo de Yang Hui
4. Asigne el primer y último número de cada fila a 1 , y el resto El de abajo es la suma de los números superior izquierdo y superior derecho, el superior izquierdo es [i-1][j-1], y el superior derecho es [i-1][j].
5. Devuelve el resultado final según el tamaño.

3. Código específico

/**
 * Return an array of arrays of size *returnSize.//返回大小为*returnSize的数组
 * The sizes of the arrays are returned as *returnColumnSizes array.//数组的大小作为*returnColumnSizes数组返回
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** generate(int numRows, int* returnSize, int** returnColumnSizes){
    //ret相当于一个二维数组,ret[i]指向的是第i行
    int** ret=malloc(sizeof(int*)*numRows);//ret为指向大小为numRows个整形指针数组的指针
    *returnSize=numRows;
    *returnColumnSizes=malloc(sizeof(int)*numRows);//指向大小为numRows的整型数组
    for(int i=0;i<numRows;i++)//二维数组赋值
    {
        ret[i]=malloc(sizeof(int)*(i+1));//申请空间,每一行的个数应当是i+1,因此所形成的是三角形而不是正方形
        (*returnColumnSizes)[i]=i+1;//返回的数组中的每一行的元素个数
        ret[i][0]=ret[i][i]=1;//每一行的第一个元素还有最后一个元素都是1
        for(int j=1;j<i;j++)
        {
            ret[i][j]=ret[i-1][j]+ret[i-1][j-1];//每个数等于它左上方也就是[i-1][j-1]的和右上方[i-1][j]的和
        }
    }
    return ret;
}

Supongo que te gusta

Origin blog.csdn.net/m0_59800431/article/details/125603408
Recomendado
Clasificación