主题
复盘 · LC 118 杨辉三角
题目
- 题号:LeetCode 118
- 名称:杨辉三角(Pascal's Triangle)
- 难度:Easy
- 链接:leetcode.cn/problems/pascals-triangle
- 今日代码:
118-杨辉三角/index.js
题意
给定非负整数 numRows,生成杨辉三角的前 numRows 行。
- 第
i行有i个数(1-based)。 - 每行两端是 1;中间每个数 = 上一行左上 + 右上。
- 边界:
numRows = 1→[[1]];常见测例5行。
涉及算法
| 标签 | 一句话 |
|---|---|
| 模拟 / DP | 逐行生成;row[j] = prev[j-1] + prev[j](两端补 0 或特判) |
教程对照:04 · 数组基础题手感 练习清单里就有 LC 118;二维递推感觉可对照 22 · DP 二维入门 的「由上一层推下一层」。
评价我的解法
你的思路:先放 [[1]],从第 2 行起用上一行相邻项相加拼新行——正是标准模拟,方向完全正确,本地 numRows = 5 也能打出正确三角。
我的代码(摘自 118-杨辉三角/index.js,不含本地测例):
javascript
var generate = function (numRows) {
const res = [[1]];
for (let i = 2; i <= numRows; i++) {
const newArr = [];
const lastRes = res[i - 2];
for (let j = 0; j < i; j++) {
if (j === 0) {
const n1 = lastRes[j] ? lastRes[j] : 0;
newArr[j] = n1;
} else {
const n1 = lastRes[j - 1] ? lastRes[j - 1] : 0;
const n2 = lastRes[j] ? lastRes[j] : 0;
console.log(j, n1, n2);
newArr[j] = n1 + n2;
}
}
res.push(newArr);
}
return res;
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
务实评价:
- 正确性:杨辉三角格子恒为正,
x ? x : 0把「越界 / undefined」当 0 能工作;若以后格子可能为 0,三元会踩坑,应改?? 0或先判下标。 - 调试残留:循环里
console.log提交前应删。 - 分支可合并:
j === 0与后面本质都是「左邻 + 右邻,缺则 0」;统一写成(lastRes[j - 1] ?? 0) + (lastRes[j] ?? 0)更短,且首尾自然变 1。 - 下标略绕:
res[i - 2]不如res[res.length - 1]/prev直观;i从 2 数到numRows没问题,但可读性一般。
小结:模拟对了、能 AC;差在洁净度与「越界用 ??」的习惯。
最佳题解
逐行生成,两端自然为 1:
javascript
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function (numRows) {
const res = [];
for (let i = 0; i < numRows; i++) {
const row = new Array(i + 1);
row[0] = row[i] = 1;
for (let j = 1; j < i; j++) {
row[j] = res[i - 1][j - 1] + res[i - 1][j];
}
res.push(row);
}
return res;
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 时间 O(numRows²),空间 O(numRows²)(输出本身)。
- 为何更优:无调试输出;两端直接赋 1,中间只加相邻,意图一眼可读;不依赖「假 0」与 truthy 判断。
关联题目
| 题 | 为何相关 |
|---|---|
| 119. 杨辉三角 II | 只要第 k 行;可滚动一维数组 |
| 120. 三角形最小路径和 | 三角形 DP,相邻下推 |
| 62. 不同路径 | 组合数 / 网格递推,和杨辉数有关 |
一句话带走
杨辉三角:上一行相邻相加,两端写 1;提交前清掉 console.log,越界用 ?? 别用 truthy。
