算法 杨辉三角求解 java打印杨辉三角 多路递归打印杨辉三角 递归优化杨辉三角 记忆法优化递归 帕斯卡三角形 算法(十二)

2023-09-20 17:34:23

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);
    }


}

 

更多推荐

ChatGLM 实现一个BERT

前言本文包含大量源码和讲解,通过段落和横线分割了各个模块,同时网站配备了侧边栏,帮助大家在各个小节中快速跳转,希望大家阅读完能对BERT有深刻的了解。同时建议通过pycharm、vscode等工具对bert源码进行单步调试,调试到对应的模块再对比看本章节的讲解。涉及到的jupyter可以在代码库:篇章3-编写一个Tra

电脑不在身边能远程控制吗?

​什么是无人值守远程访问?无人值守远程访问是指对方电脑面前没有授权连接的人,可以直接远程访问对方的电脑。那么,电脑不在身边能远程控制它吗?答案当然是可以的。您可以使用远程桌面软件,在电脑无人值守的情况下远程访问它。无人值守远程访问有什么好处?无人值守的远程访问为企业提供了许多优势,如提高工作效率和安全性,员工通过无人值

用户与权限管理

文章目录用户与权限管理1.用户管理1.1MYSQL用户1.2登录MySQL服务器1.3创建用户1.4修改用户1.5删除用户1.6修改密码1.修改当前用户密码2.修改其他用户密码1.7MYSQL8密码管理用户与权限管理1.用户管理1.1MYSQL用户MYSQL用户分为普通用户和root用户root用户:超级管理员,拥有所

安防监控系统/视频云存储EasyCVR平台视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,可拓

docker-基本操作命令,生成docker镜像包

一、帮助启动类命令。1、启动,命令:systemctlstartdocker2、停止,命令:systemctlstopdocker3、重启,命令:systemctlrestartdocker4、查看docker状态,命令:systemctlstatusdocker5、开机启动,命令:systemctlenabledoc

20230921研发面经总结

1.cpp中引用和指针的区别引用是在概念上定义一个变量的别名,而指针是存储一个变量的地址。引用必须从一而终,不能再指向其他数据;指针可以随意改变指向。引用在定义时必须初始化,而指针是最好初始化,不初始化也不会报错。指针可以有多级,引用不可以。存在空指针,但是不存在空引用。2.介绍const,各种使用情况的效果1.con

Codeforces Round 896 (Div. 1) C. Travel Plan(树形dp+组合数学)

题目有一棵n(1<=n<=1e18)个点的树,点i连着2*i和2*i+1两个点,构成一棵完全二叉树对于每个点i,记其值为a[i],a[i]可以取[1,m](1<=m<=1e5)的整数记i到j的简单路径上的最大值为s[i][j],则一棵权值确定的树对答案的贡献是现在求所有可能情况下的树的贡献之和,答案对998244353

手撕 LFU 缓存

大家好,我是方圆。LFU的缩写是LeastFrequentlyUsed,简单理解则是将使用最少的元素移除,如果存在多个使用次数最小的元素,那么则需要移除最近不被使用的元素。LFU缓存在LeetCode上是一道困难的题目,实现起来并不容易,所以决定整理和记录一下。如果大家想要找刷题路线的话,可以参考Github:Leet

数据分析实战│时间序列预测

时间序列预测问题是一类常见的数据分析问题。数据中往往包含时间标签,这类问题往往根据过去一段时间的数据,建立能够比较精确地反映序列中所包含的动态依存关系的数学模型,并对未来的数据进行预测。01、问题描述及数据挖掘目标本案例给出二战时期的某气象站温度记录值,通过分析之前的天气状况来预测将来天气情况。与回归分析模型进行预测不

使用新版Maven-mvnd快速构建项目

目前我们项目的构建方式多数是maven、gradle,但是maven相对gradle来说,构建速度较慢,特别是模块相对较多的时候,构建速度更加明显。但是我们将项目由maven替换为gradle相对来说会比较麻烦,成本较高。于是我们可以选择mvnd来构建项目,可以使得构建项目速度更快,而且项目无需任何改动。1、下载mvn

SCT44160Q国产、车规 3.4-40V 160-mΩ四通道智能高位开关 P2P替代TPS4H160

SCT44160Q国产、车规3.4-40V160-mΩ四通道智能高位开关P2P替代TPS4H160北京冠宇铭通科技有限公司一级代理商描述SCT44160Q器件是全保护的四路通道智能高侧开关,带有四个集成的160-mΩNMOS功率场效应管。对于版本A,设备实现数字故障报告采用开路漏极结构,四通道同步设定电流限值。对于B版

热文推荐