Leetcode Pascal triangle i & ii 杨辉三角(帕斯卡三角)java实现以及解析

Leetcode Pascal triangle i & ii 杨辉三角(帕斯卡三角)java实现以及解析

杨辉三角其实是初高中的知识了,其实也就是二项式系数的写法
杨辉三角的第n行对应的就是二项式 ( a + b ) n (a+b)^{n} (a+b)n 的系数,不过杨辉三角是zero index的,第一行其实是 ( a + b ) 0 (a+b)^{0} (a+b)0 然后依次递推,就可以得到一个完整的杨辉三角了:
        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1
  1 6 15 20 15 6 1
 1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1

与此同时我们也要知道杨辉三角的五个性质

  1. 由正整数构成,数字左右对称,每一行由1开始然后递增最后递减降到1
  2. 第n行有n个数字
  3. 第n行的数字和为 2 n − 1 2^{n-1} 2n1
  4. 第n行的第k个数字为组合C(n-1,k-1)
  5. 每一行最左侧和最右侧的数字都为1,其他的数字则可以由当前数字的左上和右上的两个数字相加构成。

其实稍微有一些解题经验的人看到这里大概也就知道了关于杨辉三角的题目多半是需要利用动态规划来做的,因为第5的性质几乎就是最好的提示了。leetcode中直接考杨辉三角的题目只有两道,但是相关的则很多,让我们看看这简单的两题吧。

Pascal Triangle i

这个题目比较简单,基本上就是给一个数字代表了杨辉三角的大小,然后构建一个完整的杨辉三角然后用二维数组的方式返回。让我们直接看看java是怎么样实现的吧

class Pascal{
	public List<List<Integer>> pascalTriangle(int numRows){
		List<List<Integer>> res = new ArrayList<>();
		if(numRows == 0) return res;
		res.add(new ArrayList<>());
		//初始化
		res.get(0).add(1);
		for(int i = 1; i < numRows;i++){
			List<Integer> level = new ArrayList<>();
			List<Integer> prev = res.get(i-1);
			level.add(1);
			for(int j = 1; j < i;j++){
				level.add(prev.get(j-1)+prev.get(j));
			}
			level.add(1);
			res.add(level);
		}
		return res;
	}
}

再让我们看看pascal triangle ii,和第一题较为不同的是不可以使用这么多的空间要在O(k)的空间内完成这一题,当然也只需要返回当前杨辉三角的最后一行的数值即可。其实思维是差不多的,但是我们需要不断的更新当前的返回list,而不是为每一行创建新的数组。

class PascalII{
	public List<Integer> pascalTriangle(int rowNums){
		List<Integer> res = new ArrayList<>();
		if(rowNums ==0)return res;
		res.add(1);
		for(int i = 1; i < rowNums; i++){
			for(int j = res.size()-2; j >= 0; j--){
				int element = res.get(j)+res.get(j+1);
				res.set(j+1,element);
			}
			res.add(1);
		}
		return res;
	}
}

这样我们就也可以利用杨辉三角的第五性质和DP来解决这个问题了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值