Triángulo de Yanghui de programación dinámica

¡Continúe creando, acelere el crecimiento! Este es el segundo día de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de octubre", haga clic para ver los detalles del evento

La programación dinámica es una idea matemática de resolver problemas de toma de decisiones en etapas. Resuelve problemas complejos al descomponer el problema original en subproblemas simples.

Triángulo Yang Hui

Dado un número entero no negativo  numRows, genera la primera numRowsfila .

En el Triángulo de Yanghui, cada número es la suma de sus números superior izquierdo y superior derecho.

Ejemplo 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
复制代码

Ejemplo 2:

输入: numRows = 1
输出: [[1]]
复制代码

El triángulo de Yang Hui es una disposición geométrica de coeficientes binomiales en un triángulo, que apareció en el libro "Explicación detallada del algoritmo de nueve capítulos" escrito por Yang Hui, un matemático de la dinastía Song del Sur, en 1261.

Tiene las siguientes propiedades:

  1. Los números en cada fila son simétricos, comenzando desde 1 y gradualmente haciéndose más grandes y luego más pequeños, y finalmente regresan a 1. El primer y último número en cada fila son ambos 1, es decir, dp[i][0] = 1y dp[i][i] = 1
  2. Cada número es igual a la suma de los números izquierdo y derecho en la fila anterior. cual esdp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]

Solución 1

fun generate(numRows: Int): List<List<Int>> {
    val dp = Array(numRows) { IntArray(numRows) }
    for (index in 0 until numRows) {
        dp[index][0] = 1
        dp[index][index] = 1
    }
    for (i in 2 until numRows) {
        for (j in 1 until i) {
            dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
        }
    }
    val result = ArrayList<ArrayList<Int>>()
    dp.forEach {
        val r = ArrayList<Int>()
        it.forEach {
            if (it != 0) {
                r.add(it)
            }
        }
        result.add(r)
    }
    return result
}
复制代码

Solución 2

  1. De acuerdo con el ejemplo, se puede ver que cada una de sus matrices tiene diferentes longitudes, y la longitud se puede determinar de acuerdo con la n-ésima línea.
  2. Para cada línea de números, la primera y la segunda línea son 1, y las otras líneas comienzan y terminan con 1. Se juzga directamente que cuando j == 0 || j == n-1, la asignación es 1.
public List<List<Integer>> generate(int numRows) {
    List<List<Integer>> result = new ArrayList<>();
    for (int i = 0; i < numRows; i++) {
        List<Integer> item = new ArrayList<>();
        for (int j = 0; j <= i; j++) {
            if (j == 0 || j == i) {
                item.add(1);
                continue;
            }
            List<Integer> pre = result.get(i - 1);
            item.add(pre.get(j - 1) + pre.get(j));
        }
        result.add(item);
    }
    return result;
}
复制代码

la complejidad

  • Complejidad de tiempo: O (n ^ 2), debe atravesar para generar cada valor.
  • Complejidad del espacio: O (n ^ 2), cada número debe almacenarse.

Supongo que te gusta

Origin juejin.im/post/7150240310168125470
Recomendado
Clasificación