Pascal的三角形 - 非常简单的逻辑解决方案在内存和运行时击败了96%的Java解决方案
#教程 #java #leetcode #面试

直觉

问题是生成帕斯卡尔三角形的第一行,其中每个元素都是上面的两个元素的总和。解决此问题的一种可能方法是使用列表列表(或换句话说,一个2D数组)来存储行,并从第一行迭代到第n行,并根据上一行添加新元素。<<<<<<<<<<<<<<<<< /p>

方法

  • 初始化一个空列表以存储行的空列表。
  • 将第一行(仅包含1个列表)添加到行列表中。
  • 对于从1到N-1的每行,请执行以下操作:
    • 初始化一个空列表以存储当前行。
    • 在当前行的开头和结尾添加1个。
    • 对于从1到I-1的每个元素,我是当前行的索引,请执行以下操作:
      • 从行列表中获取上一行。
      • 从上一行中添加索引J-1和J处的元素,然后将其附加到当前行。
    • 将当前行添加到行列表中。
  • 返回行列表。

复杂

  • 时间复杂性:O(n^2)

我们需要迭代n行,对于每行i,我们都需要在i元素上迭代。元素的总数是n(n+1) / 2​,它是渐近符号中的O(n^2)

  • 空间复杂性:O(n^2)

我们需要存储n行,并且每行我都有元素。所需的总空间是n(n+1) / 2​,它是渐近符号中的O(n^2)

代码

public class Solution {
    public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> allRows = new ArrayList<>(numRows);
        List<Integer> firstRow = new ArrayList<>();
        firstRow.add(1);
        allRows.add(firstRow);
        for (int i = 1; i < numRows; i++) {
            List<Integer> row = new ArrayList<>(i + 1);
            row.add(1);
            List<Integer> prevRow = allRows.get(i - 1);
            for (int j = 1; j < i; j++) {
                int sum = 0;
                if (j - 1 >= 0 && j - 1 < prevRow.size()) {
                    sum += prevRow.get(j - 1);
                }
                if (j >= 0 && j < prevRow.size()) {
                    sum += prevRow.get(j);
                }
                row.add(sum);
            }
            row.add(1);
            allRows.add(row);
        }
        return allRows;
    }
}