直觉
问题是生成帕斯卡尔三角形的第一行,其中每个元素都是上面的两个元素的总和。解决此问题的一种可能方法是使用列表列表(或换句话说,一个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;
}
}