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

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 × 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!(nm)!n!=0!(50)!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!(nm)!n!=1!(51)!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!(52)!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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值