文内代码全部采用JAVA语言。
题目
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。
测试用例
输入: 3
输出: [1,3,3,1]
个人解法
119题基本和118题一样,甚至比118题还要简单一点。唯一的区别在于,两题对行数的理解不同,这里的行数是从0开始计算的,第0行就是[1],而118题的第0行是[]。将118稍微修改一下即可。
执行用时: 2 ms, 在Pascal’s Triangle II的Java提交中击败了67.25% 的用户
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row1=new ArrayList<Integer>();
row1.add(1);
if (rowIndex==0) {
return row1;
}
for (int i = 1; i <=rowIndex; i++) {
Iterator<Integer> it=row1.iterator();
int a=0;
List<Integer> row2=new ArrayList<Integer>();
while (it.hasNext()) {
int b=it.next();
row2.add(a+b);
a=b;
}
row2.add(1);
row1=row2;
}
return row1;
}
}
大神解法
思路
杨辉三角值的直接求解,第n行第m个数的值,就是C(n,m-1),即为从n个不同元素中取m-1个元素的组合数。这里大神直接用(s = (rowIndex - j+1) * s / j))一行就实现了迭代求组合数,真是佩服。组合数公式如下:
比如,要求第五行。第一个数直接为1,C(5,0)=5。
C
(
5
,
1
)
=
n
!
m
!
(
n
−
m
)
!
=
5
!
0
!
(
5
−
0
)
!
=
5
×
4
×
3
×
2
×
1
1
×
(
5
×
4
×
3
×
2
×
1
)
=
1
C(5,1) =\frac{n!}{m!(n-m)!} =\frac{5!}{0!(5-0)!} =\frac{5\times4\times3\times2\times1}{1\times(5\times4\times3\times2\times1)}=1
C(5,1)=m!(n−m)!n!=0!(5−0)!5!=1×(5×4×3×2×1)5×4×3×2×1=1
第二个数为C(5,1)=5,直接等于行数。
C
(
5
,
1
)
=
n
!
m
!
(
n
−
m
)
!
=
5
!
1
!
(
5
−
1
)
!
=
5
×
4
×
3
×
2
×
1
1
×
(
4
×
3
×
2
×
1
)
=
5
=
C
(
5
,
0
)
×
5
1
C(5,1) =\frac{n!}{m!(n-m)!} =\frac{5!}{1!(5-1)!} =\frac{5\times4\times3\times2\times1}{1\times(4\times3\times2\times1)}=5=C(5,0)\times\frac{5}{1}
C(5,1)=m!(n−m)!n!=1!(5−1)!5!=1×(4×3×2×1)5×4×3×2×1=5=C(5,0)×15
再看第三个数。C(5,2)
C
(
5
,
2
)
=
5
!
2
!
(
5
−
2
)
!
=
5
×
4
×
3
×
2
×
1
(
1
×
2
)
×
(
3
×
2
×
1
)
=
10
=
C
(
5
,
1
)
×
4
2
C(5,2) =\frac{5!}{2!(5-2)!} =\frac{5\times4\times3\times2\times1}{(1\times2)\times(3\times2\times1)}=10=C(5,1)\times\frac{4}{2}
C(5,2)=2!(5−2)!5!=(1×2)×(3×2×1)5×4×3×2×1=10=C(5,1)×24
…
以下不一一列举。
可以发现后一个数就是在前一个数的基础上,除以 位置序号-1,再乘上(行数-位置序号+2)
算法
执行用时: 0 ms, 在Pascal’s Triangle II的Java提交中击败了100.00% 的用户。相当强了。
class Solution {
public List<Integer> getRow(int rowIndex) {
double s=1;
List<Integer> list =new ArrayList<Integer>();
if(rowIndex>0)list.add(1); // 输出第一个 1
for (int j = 1; j <= rowIndex - 1; j++)
list.add((int)(s = (rowIndex - j+1) * s / j));
list.add(1);
return list;
}
}