
题目速览LeetCode 118. 杨辉三角简单给定一个非负整数numRows生成杨辉三角的前numRows行。规则很简单每个数是它左上方和右上方的数的和。每行第一个和最后一个都是 1。示例输入: 5 输出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 我的第一反应差点翻车看到这种二维结构我第一反应是这不就是个二维 List 嘛直接套两层循环。于是我写出了大概这样的逻辑外层循环控制行数。内层循环给每一行塞数。如果是第一个或最后一个塞 1。否则去上一行拿数相加。结果一跑直接给我报了个IndexOutOfBoundsException。我当时一脸懵“我不是已经判断了j 0 || j i了吗怎么还会越界” 排查过程关键坑点后来我盯着代码看了十分钟终于发现问题出在这我把result.add(row)写在内层循环里了。也就是说每算一个数我就把整行加了一遍。算第 0 个加一次 row算第 1 个又加一次 row这就导致result里的行数乱了等到下一行去result.get(i-1)拿上一行数据时拿到的根本不是我想的那个。还有一个隐藏问题当i 0的时候如果不特殊处理第一行会是空的这也直接导致后面全崩。 正确的姿势理清索引关系冷静下来重新理逻辑其实杨辉三角的规律非常死板不需要瞎猜第 i 行有 i 1 个数i 从 0 开始。首尾一定是 1。中间的数 上一行[j-1] 上一行[j]。只要保证一行算完了再丢进结果集里就不会乱。✅ 最终代码可直接交class Solution { public ListListInteger generate(int numRows) { ListListInteger result new ArrayList(); for (int i 0; i numRows; i) { ListInteger row new ArrayList(); for (int j 0; j i; j) { if (j 0 || j i) { row.add(1); } else { int left result.get(i - 1).get(j - 1); int right result.get(i - 1).get(j); row.add(left right); } } // ✅ 关键一行结束了再 add result.add(row); } return result; } } 执行过程拆解n 5行号 i计算过程当前行0只有一个 1[1]11 1[1, 1]21, (11), 1[1, 2, 1]31, (12), (21), 1[1, 3, 3, 1]41, (13), (33), (31), 1[1, 4, 6, 4, 1] 我踩过的坑避坑指南别急着往结果里加❌ 内层循环里add(row)✅ 外层循环结束再add(row)边界一定要死记第一行必须是[1]每一行第一个和最后一个一定是1索引别写反result.get(i - 1)才是上一行j - 1和j别搞混 一句话总结杨辉三角看似是数学题其实是数组索引控制题。只要你记住一行算完再存首尾填 1中间去上一行拿数这题就稳了。 面试怎么说建议背“这题我用模拟的方式来做。用一个二维 List 存储结果外层循环控制行数。每一行第一个和最后一个元素固定为 1中间的元素通过上一行的两个相邻元素相加得到。注意要把整行构造完成后再加入结果集避免索引错乱。”写完这篇我才发现很多题不是难而是我们太着急下手写了。先画图再写代码真的能救命。