杨辉三角的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的操作需在循环前后独立完成。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐