1. 杨辉三角II问题解析
杨辉三角II是LeetCode上经典的数学与编程结合题型(编号119),要求返回杨辉三角的第k行(从0开始计数)。这个问题看似简单,却蕴含着组合数学的精妙思想,也是面试中检验候选人数学思维和编程基本功的常见题目。
注意:题目明确要求空间复杂度优化到O(k),这直接排除了先构建完整杨辉三角再取行的暴力解法。
1.1 数学本质与递推关系
杨辉三角的数学本质是二项式系数,第n行第m个数字对应组合数C(n,m)。其核心递推公式为:
code复制C(n,k) = C(n-1,k-1) + C(n-1,k)
但在实际计算中,我们更常用的是它的变体形式:
code复制C(n,k) = C(n,k-1) * (n - k + 1) / k
这个公式让我们可以在O(1)空间复杂度下,通过前一项计算后一项。例如计算第5行:
code复制C(5,0)=1 → C(5,1)=5 → C(5,2)=10 → C(5,3)=10 → C(5,4)=5 → C(5,5)=1
1.2 边界条件处理
实际编码时需要特别注意两种特殊情况:
- rowIndex=0时直接返回[1]
- rowIndex=1时返回[1,1]
虽然数学上可以统一处理,但提前判断这些边界条件能让代码更健壮,避免不必要的计算。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最优解实现方案
2.1 线性时间复杂度解法
python复制def getRow(rowIndex):
row = [1] * (rowIndex + 1)
for i in range(1, rowIndex):
row[i] = row[i-1] * (rowIndex - i + 1) // i
return row
这个实现有几个关键点:
- 初始化长度为rowIndex+1的全1数组
- 遍历时从第2个元素到倒数第2个元素(避免头尾的1被修改)
- 使用
//确保整数除法(Python中/会得到float)
实测发现:在Python中如果不使用//,当rowIndex较大时会出现浮点精度问题。例如rowIndex=30时,某些中间结果会变成xx.999999的形式,转int时出错。
2.2 不同语言的实现差异
Java版本需要注意:
java复制class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<>();
long val = 1;
for (int j = 0; j <= rowIndex; j++) {
row.add((int)val);
val = val * (rowIndex - j) / (j + 1);
}
return row;
}
}
Java中必须使用long类型存储中间结果,否则在rowIndex>30时会溢出。这也是面试时常考的细节。
C++版本的特殊处理:
cpp复制vector<int> getRow(int rowIndex) {
vector<int> row(rowIndex+1, 1);
for(int i=1; i<rowIndex; ++i){
row[i] = (long)row[i-1] * (rowIndex-i+1) / i;
