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来解决这个问题了。

你可能感兴趣的:(java算法,java,动态规划,数据结构,算法)