一、题目
1、题目描述
给定一个非负索引 r o w I n d e x rowIndex rowIndex,返回「杨辉三角」的第 r o w I n d e x rowIndex rowIndex 行。在「杨辉三角」 中,每个数是它左上方和右上方的数的和。
2、基础框架
class Solution {
public List<Integer> getRow(int rowIndex) {
}
}
3、原题链接
二、解题报告
1、组合公式
1.1 思路分析
(
1
)
(1)
(1)
排列:
\textbf{排列:}
排列: 从
n
n
n 个不同的元素中,任取
m
(
m
⩽
n
,
m
与
n
均为自然数
)
m(m \leqslant n,m 与n均为自然数)
m(m⩽n,m与n均为自然数) 元素按照一定的顺序排成一列,叫做从
n
n
n 个元素中取出
m
m
m 个元素的一个排列;从
n
n
n 个不同元素中取出
m
(
m
⩽
n
)
m(m \leqslant n)
m(m⩽n) 个元素的所有排列的个数,叫做从
n
n
n 个不同元素中取出
m
m
m 个元素的排列数,用符号
A
n
m
(
或者是
P
n
m
)
\mathrm{A_n^m}(或者是 \mathrm{P_n^m})
Anm(或者是Pnm)表示。排列的计算公式如下所示:
A
n
m
=
n
!
(
n
−
m
)
!
=
n
×
(
n
−
1
)
×
(
n
−
2
)
⋯
×
(
n
−
m
+
1
)
⏟
m个数字
\mathrm{A_n^m} = \frac{n!}{(n-m)!} = \underbrace{n \times (n-1) \times (n-2) \cdots \times (n-m+1)}_{{\text{m个数字}}}
Anm=(n−m)!n!=m个数字
n×(n−1)×(n−2)⋯×(n−m+1)
公式理解:
\textup{公式理解:}
公式理解: 从
n
n
n 个人选
m
m
m 个来排队
(
m
⩽
n
)
(m \leqslant n)
(m⩽n) ;第一个位置可选择人选有
n
n
n 个,第二个位置可选择人选有
n
−
1
n-1
n−1 个,依此类推,第
m
m
m 个(最后一个)可选择人选有
n
−
m
+
1
n-m+1
n−m+1 个 。
(
2
)
(2)
(2)
组合:
\textbf{组合:}
组合: 从
n
n
n 个不同元素中,任取
m
(
m
⩽
n
,
m
与
n
均为自然数
)
m(m \leqslant n,m 与n均为自然数)
m(m⩽n,m与n均为自然数) 个元素组成一个集合,叫做从
n
n
n 个不同元素中取出
m
m
m 个元素的一个组合;从
n
n
n 个不同元素中取出
m
(
m
⩽
n
)
m(m\leqslant n)
m(m⩽n) 个元素的所有组合的个数,叫做从
n
n
n 个不同元素中取出
m
m
m 个元素的组合数。用符号
C
n
m
\mathrm{C_n^m}
Cnm 来表示。组合的计算公式如下所示:
C
n
m
=
n
!
(
n
−
m
)
!
×
m
!
=
n
×
(
n
−
1
)
×
(
n
−
2
)
⋯
×
(
n
−
m
+
1
)
m
×
(
m
−
1
)
×
⋯
×
1
\mathrm{C_n^m} = \frac{n!}{(n-m)! \times m!} = \frac{n \times (n-1) \times (n-2) \cdots \times (n-m+1)}{m \times (m-1) \times \cdots \times 1}
Cnm=(n−m)!×m!n!=m×(m−1)×⋯×1n×(n−1)×(n−2)⋯×(n−m+1)
公式理解:
\textup{公式理解:}
公式理解: 考虑从
n
n
n 个人中选取
m
(
m
⩽
n
)
m(m \leqslant n)
m(m⩽n) 个出来,不排队,不在乎顺序即为
C
n
m
\mathrm{C_n^m}
Cnm。如果在乎排列那么就是
A
n
m
\mathrm{A_n^m}
Anm,如果不在乎那么就要除掉重复,同样选出的来的
m
m
m 个人,他们还要全排列才能得
A
n
m
\mathrm{A_n^m}
Anm,所以得:
C
n
m
×
m
!
=
A
n
m
\mathrm{C_n^m} \times \mathrm{m!} = \mathrm{A_n^m}
Cnm×m!=Anm
C
n
m
=
A
n
m
m
!
=
n
!
(
n
−
m
)
!
×
m
!
\mathrm{C_n^m} = \frac{\mathrm{A_n^m}}{\mathrm{m!}} = \frac{n!}{(n-m)! \times m!}
Cnm=m!Anm=(n−m)!×m!n!
C
n
m
=
(
n
m
)
\mathrm{C_n^m} = \dbinom{n}{m}
Cnm=(mn)
(
3
)
(3)
(3)
杨辉三角:
\textbf{杨辉三角:}
杨辉三角: 杨辉三角中第
n
n
n 行
k
k
k
(n
和
k都是从0开始计数)
\textbf{(n 和 k都是从0开始计数)}
(n 和 k都是从0开始计数) 列上的数为组合数
C
n
k
\mathrm{C_n^k}
Cnk;递推该公式可得:
C
n
k
=
C
n
k
−
1
×
n
−
k
+
1
k
\mathrm{C_n^k} = \mathrm{C_n^{k-1}} \times \frac{n-k+1}{k}
Cnk=Cnk−1×kn−k+1 ;由于
C
n
0
=
1
\mathrm{C_n^0} = 1
Cn0=1 ,利用该公式可以在线性时间内计算出第
n
n
n 行的所有组合数。
1.2 复杂度分析
空间复杂度:
O
(
1
)
O(1)
O(1) 。
时间复杂度:
O
(
n
)
O(n)
O(n) 。
1.3 代码详解
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<Integer>();
row.add(1);
for (int i = 1; i <= rowIndex; ++i) {
row.add((int) ((long) row.get(i - 1) * (rowIndex - i + 1) / i));
}
return row;
}
}