您的位置:首页 > 编程语言 > Java开发

Java&LeetCode 初入门——119. 杨辉三角 II

2019-01-14 13:48 465 查看

Java&LeetCode 初入门——119. 杨辉三角 II

文内代码全部采用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×11×(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×11×(4×3×2×1)=5=C(5,0)×51 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)×42 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: