1. 杨辉三角:
是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。 --百度百科
2. 杨辉三角特点:
1. 每个数等于它上方两数之和
2. 每行数字左右对称,由1开始逐渐变大
3. 第n行的数字有n项
4. 前n行共[(1+n)n]/2 个数
5. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数
3. 图像:
4.公式:
行 i,列 j ,那么 [i][j] 的取值应为 [i-1]*[j-1] + [i-1][j]
当i=0 或 i=j 时, [i][j]值为1
5. 多路递归第一版:
- package com.nami.algorithm.study.day09;
-
- /**
- * beyond u self and trust u self.
- *
- * @Author: lbc
- * @Date: 2023-09-20 14:32
- * @email: 594599620@qq.com
- * @Description: keep coding
- */
- public class PascalTriangle {
-
- public static int calculate(int i, int j) {
- if (i == j || j == 0) {
- return 1;
- }
- return calculate(i - 1, j - 1) + calculate(i - 1, j);
- }
-
- /**
- * 每行空白区域
- * @param n
- * @param i
- */
- private static void printSpace(int n, int i) {
- // 参数2 与下面打印的 %-4d 的数字有关系,是他的一半
- int num = (n - 1 - i) * 2;
- for (int j = 0; j < num; j++) {
- System.out.print(" ");
- }
- }
-
- public static void print(int row) {
- for (int i = 0; i < row; i++) {
- printSpace(row, i);
- for (int j = 0; j <= i; j++) {
- // System.out.print(calculate(i, j) + " ");
- System.out.printf("%-4d", calculate(i, j));
- }
- System.out.println();
- }
- }
-
- public static void main(String[] args) {
- long start = System.currentTimeMillis();
- print(10);
- System.out.println(System.currentTimeMillis() -start + "ms");
- }
-
-
- }
6. 当前版本可优化地方,同之前相同,用数组当缓存,存储之前计算得值。他得结果同之前计算得有关系;时间在层数多了之后,速度明显提升
- package com.nami.algorithm.study.day09;
-
- /**
- * 二维数组记忆法
- * beyond u self and trust u self.
- *
- * @Author: lbc
- * @Date: 2023-09-20 14:32
- * @email: 594599620@qq.com
- * @Description: keep coding
- */
- public class PascalTrianglePlus {
-
- public static int calculate(int[][] cache, int i, int j) {
- // 判断数组内是否有上一行得值
- if (cache[i][j] > 0) {
- return cache[i][j];
- }
- if (i == j || j == 0) {
- cache[i][j] = 1;
- return 1;
- }
- // 存入数组,方便下次使用
- cache[i][j] = calculate(cache, i - 1, j - 1) + calculate(cache, i - 1, j);
- return cache[i][j];
- }
-
- /**
- * 每行空白区域
- * @param n
- * @param i
- */
- private static void printSpace(int n, int i) {
- // 参数2 与下面打印的 %-4d 的数字有关系,是他的一半
- int num = (n - 1 - i) * 2;
- for (int j = 0; j < num; j++) {
- System.out.print(" ");
- }
- }
-
- public static void print(int row) {
- // 使用二维数组记忆法
- // 也可以使用map,但是感觉没有数组简洁,map占用更大
- int[][] cache = new int[row][];
- for (int i = 0; i < row; i++) {
- cache[i] = new int[i + 1];
- printSpace(row, i);
- for (int j = 0; j <= i; j++) {
- // System.out.print(calculate(i, j) + " ");
- System.out.printf("%-4d", calculate(cache, i, j));
- }
- System.out.println();
- }
- }
-
- public static void main(String[] args) {
- long start = System.currentTimeMillis();
- print(50);
- // 当打印30层时候,二者速度:1700ms, 18ms
- System.out.println(System.currentTimeMillis() -start + "ms");
- }
-
-
- }
7. 非递归方式解决,采用直接计算好每行的值
- package com.nami.algorithm.study.day09;
-
- /**
- * 非递归方式
- * beyond u self and trust u self.
- *
- * @Author: lbc
- * @Date: 2023-09-20 14:32
- * @email: 594599620@qq.com
- * @Description: keep coding
- */
- public class PascalTriangleUltra {
-
- public static void createRow(int[] row, int i) {
- if (i == 0) {
- row[0] = 1;
- return;
- }
- for (int j = i; j > 0; j--) {
- row[j] = row[j] + row[j - 1];
- }
-
- }
-
- private static void printSpace(int n, int i) {
- // 参数2 与下面打印的 %-4d 的数字有关系,是他的一半
- int num = (n - 1 - i) * 2;
- for (int j = 0; j < num; j++) {
- System.out.print(" ");
- }
- }
-
- public static void print(int row) {
- // 使用二维数组记忆法
- // 也可以使用map,但是感觉没有数组简洁,map占用更大
- int[] cache = new int[row];
- for (int i = 0; i < row; i++) {
- createRow(cache, i);
- printSpace(row, i);
- for (int j = 0; j <= i; j++) {
- // System.out.print(calculate(i, j) + " ");
- System.out.printf("%-4d", cache[j]);
- }
- System.out.println();
- }
- }
-
- public static void main(String[] args) {
- long start = System.currentTimeMillis();
- print(10);
- // 当打印40层时候 , plus ,ultra 二者速度:21ms, 21ms 差不多
- System.out.println(System.currentTimeMillis() - start);
- }
-
-
- }