動的計画法の陽輝三角形

創造し続け、成長を加速!「ナゲッツデイリー新プラン・10月アップデートチャレンジ」参加2日目です、イベント詳細はこちら

動的計画法は、意思決定の問題を段階的に解決する数学的アイデアであり、元の問題を単純なサブ問題に分解することで複雑な問題を解決します。

陽会三角

負でない整数 numRowsを指定すると、"Yanghui Triangle" の最numRows前列ます。

陽匯三角形では、各数字は左上と右上の数字の合計です。

例 1:

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

例 2:

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

楊冪の三角形は、南宋時代の数学者である楊冪が1261年に著した著書「九章アルゴリズムの詳細な説明」に登場する二項係数を三角形に幾何学的に配置したものです。

次のプロパティがあります。

  1. 各行の数字は対称で、1 から始まり、徐々に大きくなり、次に小さくなり、最後に 1 に戻ります。各行の最初と最後の数字は両方とも 1、つまりdp[i][0] = 1 dp[i][i] = 1
  2. 各数値は、前の行の左と右の数値の合計に等しくなります。これはdp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]

解決策 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
}
复制代码

解決策 2

  1. この例によれば、その配列のそれぞれが異なる長さを持っていることがわかり、長さは n 番目の行に従って決定できます。
  2. 数値の各行について、1 行目と 2 行目は 1 で、他の行は 1 で始まり、1 で終わります。j == 0 || j == n-1 の場合、代入は 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;
}
复制代码

複雑さ

  • 時間の複雑さ: O(n^2)、各値を生成するにはトラバースする必要があります。
  • スペースの複雑さ: O(n^2)、すべての数値を格納する必要があります。

おすすめ

転載: juejin.im/post/7150240310168125470