C++ 帕斯卡三角形(Pascal’s Triangle)

        帕斯卡三角形是二项式系数的三角形阵列。编写一个函数,以整数值N作为输入,并打印帕斯卡三角形的前N​​行。

例子:

下图显示了 N=6 的帕斯卡三角形 

使用二项式系数的帕斯卡三角形:
        每行的条目数等于行号。例如,第一行有“1 ”,第二行有“ 1 1 ”,第三行有“1 2 1 ”,等等。一行中的每个条目都是二项式系数的值。行号 line 中第 i 个条目的值为C(line, i)。可以使用以下公式计算该值。

C(line, i) = line! / ( (line-i)! * i! )

算法:

    对帕斯卡三角形的每一行(即 1 到N )运行一个循环。
        对于每一行,对该行的每个元素运行内部循环。
            使用方法中提到的公式计算元素的二项式系数。
            
下面是上述方法的实现:

//  C++ code for Pascal's Triangle
#include <iostream>
using namespace std;
 
 
int binomialCoeff(int n, int k);
 
// Function to print first
// n lines of Pascal's
// Triangle
void printPascal(int n)
{
    // Iterate through every line and
    // print entries in it
    for (int line = 0; line < n; line++) {
        // Every line has number of
        // integers equal to line
        // number
        for (int i = 0; i <= line; i++)
            cout << " " << binomialCoeff(line, i);
        cout << "\n";
    }
}
 

// for details of this function

//https://blog.csdn.net/hefeng_aspnet/article/details/139958642
int binomialCoeff(int n, int k)
{
    int res = 1;
    if (k > n - k)
        k = n - k;
    for (int i = 0; i < k; ++i) {
        res *= (n - i);
        res /= (i + 1);
    }
 
    return res;
}
 
// Driver program
int main()
{
    int n = 7;
    printPascal(n);
    return 0;
}
 
// This code is contributed by shivanisinghss2110

输出:


 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

时间复杂度: O(N^3),其中 N 是要打印的行数
辅助空间: O(1)

使用动态规划的帕斯卡三角形:
        如果我们仔细观察三角形,我们会发现每个条目都是其上方两个值的总和。因此,使用动态规划,我们可以创建一个二维数组来存储先前生成的值。为了在一行中生成一个值,我们可以使用数组中先前存储的值。 

案例:

if line == 0 or line == i
        arr[line][i] =1
else:
        arr[line][i] = arr[line-1][i-1] + arr[line-1][i]

下面是上述方法的实现:

// C++ program for Pascal’s Triangle
// A O(n^2) time and O(n^2) extra space 
// method for Pascal's Triangle
#include <bits/stdc++.h>
using namespace std;
 
void printPascal(int n)
{
     
    // An auxiliary array to store 
    // generated pascal triangle values
    int arr[n][n]; 
 
    // Iterate through every line and 
    // print integer(s) in it
    for (int line = 0; line < n; line++)
    {
        // Every line has number of integers 
        // equal to line number
        for (int i = 0; i <= line; i++)
        {
        // First and last values in every row are 1
        if (line == i || i == 0)
            arr[line][i] = 1;
           
        // Other values are sum of values just 
        // above and left of above
        else
            arr[line][i] = arr[line - 1][i - 1] + 
                            arr[line - 1][i];
        cout << arr[line][i] << " ";
        }
        cout << "\n";
    }
}
 
// Driver code
int main()
{
    int n = 5;
    printPascal(n);
    return 0;
}
 
// This code is Contributed by Code_Mech.

输出:


1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1

时间复杂度:O(N^2)
辅助空间: O(N^2)

注意:此方法可以优化为使用 O(n) 额外空间,因为我们只需要前一行的值。因此,我们可以创建一个大小为 n 的辅助数组并覆盖值。以下是另一种仅使用 O(1) 额外空间的方法。

使用二项式系数的帕斯卡三角形(空间优化):
        该方法基于使用二项式系数的方法。我们知道行号 line 中的第 i 个条目是二项式系数 C(line, i) ,并且所有行都以值 1 开头。这个想法是使用C(line, i-1)计算C(line, i ) 。它可以在 O(1) 时间内计算出来。

C(line, i) = line! / ( (line-i)! * i! )
C(line, i-1) = line! / ( (line – i + 1)! * (i-1)! )

我们可以从以上两个表达式得出以下表达式。

C(line, i) = C(line, i-1) * (line – i + 1) / i

因此,可以在 O(1) 时间内通过 C(line, i-1) 计算出 C(line, i)

以下是该方法的实现:

// C++ program for Pascal’s Triangle
// A O(n^2) time and O(1) extra space
// function for Pascal's Triangle
#include <bits/stdc++.h>
 
using namespace std;
void printPascal(int n)
{
 
    for (int line = 1; line <= n; line++) {
        int C = 1; // used to represent C(line, i)
        for (int i = 1; i <= line; i++) {
 
            // The first value in a line is always 1
            cout << C << " ";
            C = C * (line - i) / i;
        }
        cout << "\n";
    }
}
 
// Driver code
int main()
{
    int n = 5;
    printPascal(n);
    return 0;
}
 
// This code is contributed by Code_Mech

输出:


1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1

时间复杂度: O(n 2 )
辅助空间: O(1)

面试中可能会问到的问题变体:

1、找到如上所示的整个帕斯卡三角形。

2、在 O(n) 时间内给定行号和列号,仅找到帕斯卡三角形的一个元素。

3、在 O(n) 时间内,给定行号,找到帕斯卡三角形的特定行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/788999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基因检测3 - 遗传性耳聋

1. 耳聋简介 在每1000个新生儿中有1-3个耳聋患儿&#xff0c;绝大部分为遗传学耳聋。遗传性耳聋疾病的遗传方式包括常染色体隐性遗传、常染色体显性遗传、线粒体遗传以及伴性遗传。 根据遗传性耳聋除听力损失外是否存在其他表型&#xff0c;将耳聋分为综合征型耳聋 &#xff…

网页视频提取在线工具

在互联网的海洋中&#xff0c;我们时常会遇到一些令人心动的视频&#xff0c;想要将其下载到本地&#xff0c;以便随时观看。然而&#xff0c;网页视频下载对于很多人来说&#xff0c;似乎是个复杂的过程。别担心&#xff0c;今天我就为大家带来一份详尽的网页视频下载教程&…

79 单词搜索

题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或…

捷配PCB 6个PCB板材关键参数解读技巧

PCB板材是指覆铜基板&#xff0c;是制造电路板的最主要材料。 板材的一些关键性能参数对电路板的生产加工、元器件贴装焊接、电子产品的功能实现以及产品的使用环境或寿命等都将产生一定程度的影响&#xff0c;所以掌握板材的关键参数在实际应用中非常有必要。 PCB板材的关键性…

数据融合工具(5)面中心线提取

这是一个重磅工具&#xff0c;建议先看视频。 提取中心线 一、需求背景 说真的&#xff0c;当小编第一次使用ArcGIS中的Polygon To Centerline工具提取面要素中心线时&#xff0c;激动得无以言表&#xff0c;毕竟&#xff0c;以前要提取面中心线&#xff0c;是一件非常麻烦的事…

完美解决ImportError: cannot import name ‘idnadata‘的正确解决方法,亲测有效!!!

完美解决ImportError: cannot import name idnadata’的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决ImportError: cannot import name idnadata的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01;报错问题…

python parser.add_argument

7->prefix_chars&#xff1a;前缀可选参数的字符集(默认值:’ - ) import argparseparser argparse.ArgumentParser(descriptionTesting...) #创建对象parser.add_argument(test,typeint) ##添加单个命令参数 parser.add_argument(test_1,typefloat) ##type是输入的指定类型…

为什么要安装HTTPS证书?

安装HTTPS证书对于确保网站数据的安全性、增强用户信任度、提升品牌形象和优化搜索引擎排名至关重要。在互联网时代&#xff0c;信息传输的安全性和隐私保护已成为公众和企业最为关注的问题之一。HTTPS证书的引入&#xff0c;正是为了解决这些问题&#xff0c;为网站和用户提供…

MySQL之基本查询(上)-表的增删查改

目录 Create(创建) 案例建表 插入 单行数据 指定列插入 单行数据 全列插入 多行数据 全列插入 插入是否更新 插入时更新 替换 Retrieve(读取) 建表插入 select列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件 比较运算符 逻辑运…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

Canvas:掌握图像变换合成与裁剪状态像素操作

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

LabVIEW优化氢燃料电池

太阳能和风能的发展引入了许多新的能量储存方法。随着科技的发展&#xff0c;能源储存和需求平衡的方法也需要不断创新。智慧城市倡导放弃石化化合物&#xff0c;采用环境友好的发电和储能技术。氢气系统和储存链在绿色能源倡议中起着关键作用。然而&#xff0c;氢气密度低&…

git为文件添加可执行权限

查看文件权限 git ls-files --stage .\SecretFinder.py100644 表示文件的所有者有读取和写入权限 添加可执行权限 git update-index --chmod x .\SecretFinder.py再次查看文件权限 git ls-files --stage .\SecretFinder.py100755 表示文件的所有者有读取、写入和执行权限

记录|C#安装+HslCommunication安装

记录线索 前言一、C#安装1.社区版下载2.VS2022界面设置 二、HslCommunication安装1.前提2.安装3.相关文件【重点】 更新记录 前言 初心是为了下次到新的电脑上安装VS2022做C#上机位项目时能快速安装成功。 一、C#安装 1.社区版下载 Step1. 直接点击VS2022&#xff0c;跳转下…

Python基于you-get下载网页上的视频

​ 1.python 下载地址 下载 : https://www.python.org/downloads/ 2. 配置环境变量 配置 python_home 地址 配置 python_scripts 地址 在path 中加入对应配置 3. 验证 ​ C:\Users>python --version Python 3.12.4C:\Users>wheel version wheel 0.43.04. 下载 c…

JS之防抖和节流

防抖 (debounce) 所谓防抖&#xff0c;就是指触发事件后在 n 秒内函数只能执行一次&#xff0c;如果在 n 秒内又触发了事件&#xff0c;则会重新计算函数执行时间。 ps: 重置普攻&#xff0c;百度翻译要输完停止一定时间后才翻译。 没有防抖和节流的缺点&#xff1a; 函数触发…

一天20MW!天途推出无人机全自主光伏巡检平台

01 光伏电站的运维挑战 光伏发电为人类提供了可持续的清洁能源供给。一般集中式电站建设在空旷的地区&#xff0c;如荒地、沙漠等地区&#xff1b;分布式电站建设在用户的屋顶和建筑物表面&#xff0c;如住宅、商业建筑、工业厂房等地区。 随着光伏电站的大规模的使用&#x…

解决:WPS,在一个表格中,按多次换行,无法换到下一页

现象&#xff1a;在一个表格里面&#xff0c;多次按下回车&#xff0c;始终无法到下一页 解决方法&#xff1a;右击—>表格属性—>选择行—>勾选 允许跨页断行 效果演示 对比展示

Centos7 被停用!如何利用 Ora2Pg 将 Oracle 迁移至 IvorySQL?

在过去的社区讨论中&#xff0c;想要使用或正在使用IvorySQL的社区用户&#xff0c;经常问到Oracle 如何迁移到 IvorySQL 中&#xff0c;而且近期随着 Centos7 官方已经停止维护&#xff0c;这一变动促使了很多将 Oracle 部署在 Centos7 上的 Oracle 用户&#xff0c;开始准备 …

Qt开发 | Qt绘图技术 | 常见图像绘制 | Qt移动鼠标绘制任意形状 | Qt绘制带三角形箭头的窗口

文章目录 一、基本绘图技术介绍二、常见的18种图形、路径、文字、图片绘制三、Qt移动鼠标绘制任意形状四、Qt绘制带三角形箭头的窗口 一、基本绘图技术介绍 Qt提供了绘图技术&#xff0c;程序员可以在界面上拖动鼠标&#xff0c;或者在代码里指定参数进行绘图。 Qt绘图技术介绍…