LeetCode 杨辉三角:Java 顺序表实现的常见疑问与解答
·
杨辉三角的Java实现核心思路
使用顺序表(ArrayList)存储每一行的元素,当前行的每个元素等于上一行相邻两个元素之和。首尾元素固定为1,需单独处理。通过动态构建每一行并添加到结果列表完成。
常见疑问与解答
如何初始化第一行? 第一行仅包含数字1,可直接创建并添加到结果列表。后续行基于前一行生成。
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>(Arrays.asList(1))); // 初始化第一行
如何计算中间元素? 从第二行开始,遍历上一行的元素,相邻两数相加得到当前行元素(索引1到size-2的范围)。
for (int j = 1; j < prevRow.size(); j++) {
currRow.add(prevRow.get(j-1) + prevRow.get(j));
}
为何使用两层ArrayList? 外层列表存储所有行,内层列表存储单行元素。这种结构能准确反映杨辉三角的层级关系。
如何处理时间复杂度和空间复杂度? 时间复杂度为O(n²),空间复杂度为O(n²)。因需要生成并存储所有行的元素,无法进一步优化。
边界条件如何考虑? 当numRows为0时返回空列表,为1时返回仅包含单行[1]的列表。需在代码开头进行判断。
if (numRows == 0) return new ArrayList<>();
完整代码示例
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new ArrayList<>();
if (numRows == 0) return result;
result.add(new ArrayList<>(Arrays.asList(1)));
for (int i = 1; i < numRows; i++) {
List<Integer> prevRow = result.get(i-1);
List<Integer> currRow = new ArrayList<>();
currRow.add(1);
for (int j = 1; j < prevRow.size(); j++) {
currRow.add(prevRow.get(j-1) + prevRow.get(j));
}
currRow.add(1);
result.add(currRow);
}
return result;
}
关键注意点
- 每次创建新行时必须初始化新的ArrayList,直接修改旧行会导致数据污染。
- 内层循环的终止条件是
j < prevRow.size(),避免索引越界。 - 添加首尾元素1的操作需在循环前后独立完成。
更多推荐
所有评论(0)