← 返回编程题库
coding-pascals-triangle-row简单免费版1000ms未尝试

杨辉三角第 k 行的 O(k) 空间解

Pascal's Triangle Row in O(k) Space

开始编码

披着马甲的 LeetCode 119:返回杨辉三角第 k 行(0-indexed),但要用 O(k) 而不是整张三角的 O(k^2) 额外空间。机械的递推 row[i] = row[i] + row[i-1] 只有一行,唯一有意思的是内层循环的方向。从右往左扫,原地更新就是对的;从左往右扫,你正要读的那个值已经被自己提前改掉了。这套一维滚动数组的纪律,正是 0/1 背包、二叉树期权定价、以及任何"新状态依赖两个相邻旧状态"的序列 DP 底下跑的同一种功夫。

请实现 solution(row_index: int) -> list[int],返回杨辉三角第 row_index 行(整数列表),使用 O(row_index) 辅助空间。

算法。 初始化 row = [1]。重复 row_index 次:让 ilen(row) - 1 倒着走到 1,置 row[i] = row[i] + row[i-1];最后 row.append(1)。返回 row

例子

  • solution(0) 返回 [1]。三角顶端只有一项,循环执行 0 次。
  • solution(2) 返回 [1, 2, 1]。从 [1] 出发:append → [1, 1];再更新下标 1(1 + 1 = 2),append → [1, 2, 1]
  • solution(10) 返回 [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]。中间的 C(10, 5) = 252 是中心二项系数。整行对称,因为 C(n, k) = C(n, n-k)

实践背景

二项式系数在 quant 桌上无处不在:Cox-Ross-Rubinstein(CRR)二叉树期权定价器里每个叶子都隐含一个 C(n, k) 路径计数权重;(p + q)^n 的多项展开复用同一组数;交易腿排列策略(先做哪条腿?)的组合枚举、离散分布的 PMF,本质上都落到杨辉三角上。这道题练的一维原地滚动数组写法,正是你在二叉树期权某一价格层上回溯时、在 0/1 背包里省掉二维表时、在 N 步原地卷积里反复用到的同一种功夫。把循环方向写对——读到旧值再覆盖新值——这个肌肉记忆是直接迁移过去的。

约束条件

  • 0 ≤ row_index ≤ 33(落在 64 位整数范围内;第 33 行用 Python `int` 表示毫无压力,这个上界主要是保证跨语言期望干净)
  • 只用一个长度 `row_index + 1` 的一维数组,不要去开整个三角
  • 比较是严格列表相等;每个元素必须是 Python 原生 `int`

样例

Case 1 · row_index=0: single-element base row

输入: [0]

期望: [1]

row_index=0 是 Pascal 三角的最顶端,只有一项 [1]。这是迭代的初始状态:循环执行 0 次直接返回。要点是循环上界要写成 `range(row_index)`,让 0 不进入循环;写成 `range(row_index + 1)` 会多迭代一次返回 [1, 1]。

Case 2 · row_index=1: [1, 1]

输入: [1]

期望: [1,1]

row_index=1 应返回 [1, 1]。从 [1] 出发,循环一次:右到左扫描内部下标(这一轮没有内部下标),然后追加一个 1。结果就是 [1, 1]。这步检查 append(1) 的正确性。

Case 3 · row_index=4: classic small row

输入: [4]

期望: [1,4,6,4,1]

row_index=4 给出经典的 [1, 4, 6, 4, 1]。这一行也是 (a+b)^4 的二项式展开系数。如果你看到 [1, 5, 10, 10, 5, 1],那是把 row_index 当成行号从 1 数起了——LeetCode 119 是 0-indexed,第 0 行就是 [1]。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · row_index=0: single-element base row

输入: [0]

期望: [1]

row_index=0 是 Pascal 三角的最顶端,只有一项 [1]。这是迭代的初始状态:循环执行 0 次直接返回。要点是循环上界要写成 `range(row_index)`,让 0 不进入循环;写成 `range(row_index + 1)` 会多迭代一次返回 [1, 1]。

Case 2 · row_index=1: [1, 1]

输入: [1]

期望: [1,1]

row_index=1 应返回 [1, 1]。从 [1] 出发,循环一次:右到左扫描内部下标(这一轮没有内部下标),然后追加一个 1。结果就是 [1, 1]。这步检查 append(1) 的正确性。

Case 3 · row_index=4: classic small row

输入: [4]

期望: [1,4,6,4,1]

row_index=4 给出经典的 [1, 4, 6, 4, 1]。这一行也是 (a+b)^4 的二项式展开系数。如果你看到 [1, 5, 10, 10, 5, 1],那是把 row_index 当成行号从 1 数起了——LeetCode 119 是 0-indexed,第 0 行就是 [1]。