杨辉三角第 k 行第 i 到 j 列的和
杨辉三角第 k 行第 i 到 j 列的和
题目描述
给定杨辉三角的行号 k 和列区间
[i, j](行列均从 0 开始),求第 k 行第
i 列到第 j 列的元素之和。
数据范围:
0 <= k0 <= i <= j <= k
核心思路
1. 杨辉三角与组合数的关系
杨辉三角第 k 行第 c
列的元素,恰好是组合数:
所以第 k 行第 i 列到第 j
列的和为:
2. 为什么用递推而不是直接算阶乘
直接算 每次都要算阶乘,效率低,而且大数阶乘很慢。
利用组合数的递推关系:
从 出发,可以 时间依次算出 ,总体 时间,且不需要预计算阶乘。
注意整除顺序:comb * (k - c) // (c + 1)
一定整除,因为
是整数。先乘后除,避免中间结果丢失精度。
3. 算法流程
- 初始化
comb = 1(即 ),ans = 0; - 对
c从0到j:- 若
c >= i,把comb累加到ans; - 更新
comb = comb * (k - c) // (c + 1),即 ;
- 若
- 返回
ans。
代码实现
行列从 0 开始
def yanghui_row_sum(k: int, i: int, j: int) -> int:
ans = 0
comb = 1
for c in range(j + 1):
if c >= i:
ans += comb
if c < j:
comb = comb * (k - c) // (c + 1)
return ans复杂度分析
- 时间复杂度:,从
0 遍历到
j。 - 空间复杂度:,只用常数个变量。
Python 整数自动支持大数,结果多大都不会溢出。
关键细节
1. 整除顺序
comb = comb * (k - c) // (c + 1)必须先乘后除:
- 先乘:
comb * (k - c)保证能被(c + 1)整除; - 后除:
//整数除法。
如果写成 comb * ((k - c) // (c + 1)),可能因
(k - c) 不能整除 (c + 1)
而丢失精度,结果错误。
2. 与「杨辉三角第 k 行和」的关系
如果 i = 0, j = k,即求整行和:
可以用快速幂直接算,但本题求任意区间和,没有简单封闭公式,只能用递推。
总结
- 本质:杨辉三角第
k行第c列 = ,求区间和即求组合数区间和; - 组合数递推:, 时间更新;
- 算法流程:从
出发,依次递推,只累加
[i, j]区间的值; - 时间 ,空间 ;
- 易错点:先乘后除,避免整除丢精度;边界截断
i、j; - 通用套路:「组合数区间和」→ 递推计算组合数,避免阶乘。
相关题目
- LC 118. 杨辉三角(生成前 n 行)
- LC 119. 杨辉三角 II(只生成第 k 行)
- LC 62. 不同路径(组合数应用)
杨辉三角第 k 行第 i 到 j 列的和
https://mingsm17518.github.io/2026/10/25/刷题笔记/机考/虾皮/03_杨辉三角第 k 行第 i 到 j 列的和/