杨辉三角之组合数解法

python/c++ Leetcode题解——118. 杨辉三角 杨辉三角,是二项式系数在三角形中的一种几何排列。它是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。杨辉三角具有以下性质:1.每行数字左右对称,由 1 开始逐渐变大再变小,并最终回到 1。2.第 n 行(从 0 开始编号)的数字有 n+1 项,前 n 行共有个数。3.第 n 行的第 m 个数(从 0 开始编号)可表示为可以被表示为组合数,记作或​,即为从 n 个不同元素中取 \m 个元素的组合数。 阅读详情

题目描述:

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

(题目及图片复制于Leetcode)


思考:这图一看脑子大概就有了个解决过程。从杨辉三角的生成规律可以知道,第n+1行的结果是从第n行产生的,所以很容易就能想到动态规划的解法。

动态方程:dp[i][j] = dp[i-1][j-1]+dp[i-1][j];

(但是具体的操作还有更加妙的处理方式,主要得益于发现者敏锐地观察力)

不过作为一名高中生,被组合数统治的恐惧依旧未散,一看到”1,3,3,1“”1,4,6,4,1“脑子里就蹦出了(害从我的博客园搬过来的发现公式没办法识别我就截图了)


下面开始实现:

方法零:打表(oier都懂得~)

方法一:动态规划

思路:一个是刚开始就构建一个包含所有前numRows行的数组数组,然后循环每个数组进行更新。

但是这样浪费空间,实际上每次操作只需要两个数组,一个是上一行,一个是本行。

然后再思考思考,是不是一行也可以呢?

可以!

这里就提到一个发现的规律(当然,是可以证明的):

比如上一行是     1        3         3            1

下一行就是     1      4         6           4            1

这两行有什么关系呢?

看:    1         3           3             1         0

+         0         1           3             3         1           

_________________________________

=>       1         4           6             4          1               (数组向右偏移一个,然后对应数字相加)

于是一个数组就可以完美解决。(具体细节自己阅读代码哦)

(注意: 由于数组大小变动,用vector数据结构比较方便)

<c++>

#include<iostream>
#include<vector>
using namespace std;
void showcase(vector <int> &outp);//显示一行
int main()
{
    int numRows;
    vector <int>outp(1, 1);//期初数组是{1}

    cout << "请输入行数:";
    cin >> numRows;

    showcase(outp); // 先把第一行输出了
    for (int i = 1; i < numRows; ++i)
    {
        outp.push_back(1);               //最后一个一定是1了
        for (auto elm = outp.end()-2; elm != outp.begin(); elm--)//大细节!若从前往后就会出问题,建议自己尝试
        {                              //从第二项处理到倒数第二项  因为两边的都已经是1了
            *elm = *(elm - 1) + *(elm);//此时前一项相当于上一行的对应数,
        }                              //本项相当于上一行偏移后的对应数
        showcase(outp);
    }
    system("pause");
    return 0;
}
void showcase(vector<int> &outp)//显示本行
{
    int siz = outp.size();
    for (int i = 0; i < siz; ++i)
    {
        cout << outp[i] << "  ";
    }
    cout << endl;
}

方法二:构造组合数函数

思路:构造组合数函数
杨辉三角第n行个数分别为

所以我们只需要构造一个Combine组合数函数(组合数不懂得可以百度哦网上教程可比我讲得全面)

遇到的问题及解决办法:
1.如果单单构建阶乘函数,那么等numRows够大后 unsigned long long都不够
解决办法:于是就直接构建了组合数函数(比如C(2,7)、C(7,2)只是7*6/2,阶乘的话就得算出7!)
2.但是构造阶乘函数unsigned long long还是不够用
解决办法:函数内部计算时用double 最后再转换成int;

 代码:

<c++>

#include<iostream>
#include<vector>
using namespace std;
int Combine(double a, double b);// 求组合数的函数
int main()
{
    int numRows;
    cout << "请输入行数:";
    cin >> numRows;
    // ans[0][0]=1;
    if (numRows == 1){ cout << 1 << endl; system("pause"); return 0; }//特判
    for (int a = 0; a<numRows; ++a)     //numRows >=2
    {
        for (int b = 0; b <= a; ++b)
        {
            cout << Combine(a, b) << "  ";
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
/*unsigned long long Factorial(int n)      //阶乘   but it turned out to be a failure
{
    if(n == 0)return 1;
    n++;
    unsigned long long  ans=1;
    for (int i = 1;i<n;++i)
    {
        ans *= i;
    }
    return ans;
}*/
int Combine(double a, double b)//组合数函数
{
    double ans = 1;
    if (b == 0 || a == b)return 1;                     //组合数定义
    int terminal = b>(a - b) ? b : (a - b);              //多算算组合数题目就懂了
    for (double i = 1; a>terminal; ans *= a / i, --a, ++i);
    return int(ans + 0.5);            //小细节
}

总结:

使用组合数的优势似乎并不是很明显(而且有点吃数学知识)。不过这个思想却是从这个例子中最大的收获。很多算法问题,顺水推舟去解决往往总会止步在效率的上限,但是用上数学的思想和工具就会有意想不到的效果(有时对效率的改进是颠覆性的)。

杨辉三角求组合数C(n,m)一位数组解决模板 利用C(n,m)直接求解公式时,会出现爆int或者longlong的事情,所以杨辉三角便起到作用了,一维数组,空间时间复杂度均十分优秀。 立即下载

相关推荐

最优控制理论 二+、哈密尔顿函数法的补充

本章基于变分法所推出的哈密尔顿函数法,2、讨论了积分方程约束的转化、控制+状态等式约束的一阶必要条件。3、控制分段连续、状态存在内点约束等情况下的角点条件,给出了协态变量和哈密尔顿函数在内点处不连续的表达式。...

MSysの优快云 9394

组合数(三种求法)

从 n个数不同的数中选出 m个的方案数是,对第一个数有两种决策,若不选,则从剩下的 n-1个中选 m个,即;若选,则从剩下的 n-1个中选 m-1个,即。所以递推式根据公式我们发现和杨辉三角一样,当n==1,m=0时,为1;当n==3,m==2时,为3。m,n数据小的时候我们可以用递推,但如果数据范围太大就要用其他方法。

2301_80304432的博客 3942

RDMA性能调优实战:如何用ib_*命令榨干你的Mellanox网卡带宽?

本文深入探讨了如何利用ib_*命令工具集对RDMA网络进行深度性能调优,以充分释放Mellanox网卡的带宽潜力。文章从理解Send/Write/Read三种核心通信原语的差异入手,逐步指导读者通过调整消息大小、队列深度、内联数据等关键参数,并结合系统级的NUMA绑定、中断亲和性等优化策略,实现从基准测试到逼近硬件极限的性能提升。

weixin_29306011的博客 88

杨辉三角求组合数

二维数组构造的杨辉三角求组合数

x1328040150的博客 995

Gartner DSG数据安全治理 架构及解读

目录背景:架构图: 解释:英文解释:(自上而下)平衡业务与风险、威胁、合规之间的关系(5个维度之间的平衡)优先处理数据集制定安全策略实施安全工具策略配置同步从上到下,从需求调研开始实施数据安全治理。千万不要跨过数据摸底、治理优先级分析、制定治理整体策略,而直接从技术工具开始对数据安全进行治理。 先明确选择需要治理的对象,优先选择重要数据进行数据安全治理工作。可以通过数据梳理、分类分级等手段,完成数据资产盘点和筛选,在纷杂的数据中理清头绪。

锦慈的技术博客 7216

手眼标定(EyeToHand)推导

Base为基坐标系(B),工具末端坐标系(T),标定板为Mark坐标系(M),相机坐标系(C)对于每两个姿态都存在上式,组成一个AX=XB的矩阵方程,X为。此时转换成AX=0的问题,单纯用SVD求奇异解便可得到。相机坐标系到Base基坐标系下的转换关系。已知标定板与机械臂末端的相对位置固定不变,,即。带入(2)式求,至此求解出需要的手眼矩阵。在眼在手外的时候,其实是要求解。

stevenreally6的博客 1143

求组合数的几种方法

定义 从 n 个不同元素中取出 m 个元素的所有组合的数目 公式 性质 (1) C ( n , m ) = C ( n , n - m ) = C ( n - 1 , m - 1 ) + C ( n - 1 , m ) (2) 实现方法1(杨辉三角) 杨辉三角第 i 行第 j 列对应 C ( i ,j ) 的结果 用动态规划求从 n 个元素中取出 m 个元素的所有组合个数 c [ i ] [ j ] :在 i 个元素中选 j 个 对于当前状态 i j ,可以由两种情况转移而来: 1、前 i - 1 个元

Cosmic_Tree的博客 865

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略 目录 Knowledge Engineering知识工程的简介 0.1、What 0.2、How 0.3、Why 1、知识工程过程的5个活动 2、知识图谱的应用 Knowledge Engineering知识工程的发展 1、前知识工程时期——1950-1970时期:图...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5335

c语言杨辉三角求排列组合,杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析...

说明本文给出杨辉三角的几种C语言实现,并简要分析典型方法的复杂度。本文假定读者具备二项式定理、排列组合、求和等方面的数学知识。一 基本概念杨辉三角,又称贾宪三角、帕斯卡三角,是二项式系数在三角形中的一种几何排列。此处引用维基百科上的一张动态图以直观说明(原文链接http://zh.wikipedia.org/wiki/杨辉三角): 从上图可看出杨辉三角的几个显著特征:1. 每行数值左右对称,且均...

weixin_30301989的博客 939

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2454

杨辉三角解法(组合数表示)

【代码】杨辉三角解法(组合数表示)

2301_80001343的博客 455

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

本文将介绍如何使用VS2022克隆下载《植物大战僵尸C++自制版本》。Gitee项目地址:Gitee仓库地址Github项目地址:Github仓库地址游戏官网地址(下载可直接运行)游戏官网。

尔灵尔亿的博客 4930

C语言杨辉三角:从二维数组到组合数公式的三种高效解法

在C语言编程中,数组是基础且核心的数据结构,用于存储和操作同类型数据集合。其原理在于通过连续内存空间和索引机制实现高效访问。掌握数组的灵活运用,对提升代码性能和解决复杂问题至关重要,尤其在算法优化和内存管理场景下。杨辉三角作为经典例题,完美串联了数组应用、递推算法和数学建模。本文聚焦**内存管理**和**算法优化**,通过对比二维数组直观法、一维数组滚动法及组合数公式法,深入剖析不同场景下的空间与效率权衡,为C语言学习者和面试者提供扎实的编程思维训练。

weixin_33785108的博客 400

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

杨辉三角--python五种实现方式

杨辉三角-----基本实现 num = 10 #标记打印多少行 YHtriangle = [] #创建一个空列表 for i in range(num): #打印的行数 YHtriangle.append([1]*(i+1)) #根据杨辉三角性质,先开括出行内的个数,填...

weixin_43801378的博客 1827

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

杨辉三角的组合数构成解法

k<=N;k++){ans.return ans;long res=1;i<=k;i++)

2402_85221001的博客 288

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

力扣LeetCode: 119 杨辉三角Ⅱ

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

weixin_73982851的博客 1212

算法0基础刷题——组合数

前言 最近由于备战蓝桥杯,码神开了个新的专题——英雄老师算法之0基础刷题记,主要作用就是写一下自己的题解报告,用来帮助自己提高一下写作能力,也是复盘的一个好方法,话不多说,发车了! 杨辉三角 介绍 性质: 每个数等于它上方两数之和。 每行数字左右对称,由1开始逐渐变大。 第n行的数字有n项。 前n行共[(1+n)n]/2 个数。 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。 对于解题有用的性质就这几个,如果想要深入了解杨辉三角,请各位彦祖百度一下。 解

秋名山码民的技术小屋 487

算法练习题24——查找杨辉三角中的组合数

逐项递推法适合处理较小的数据量,计算较为直观,但当杨辉三角行数较大时,效率较低。 二分查找法利用组合数的单调性,显著提高查找效率,适合处理较大的数据范围。这两种解法在不同场景下都可以使用,二分查找法尤其适合大规模数据下的查找问题。

hello77的blogggg 祝你得偿所愿 873

luogu P2822 组合数问题

题面传送门 对于这道题,其实题目很简单,暴力很好打。 想法111:对于每组输入数据,暴力判断两重循环枚举,一重循环计算组合数。时间复杂度O(tn3)O(tn^3)O(tn3),大概303030分 想法222:把每组数的组合存下来,直接调用。时间复杂度O(tn2)O(tn^2)O(tn2)大概353535分。 想法333:既然直接算组合数会爆精度,那么在计算组合数是就不能有除法和减法,只有加法和乘法...

fxt275307894a的博客 263

119. 杨辉三角 II

杨辉三角定义和性质解法一:递推 定义和性质 杨辉三角,是二项式系数在三角形中的一种几何排列。它是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。 杨辉三角具有以下性质: 1.每行数字左右对称,由 1 开始逐渐变大再变小,并最终回到 1。 2.第n行(从0开始编号)的数字有n+1项,前n行共有 n(n+1)2\frac{n(n+1)}{2}2n(n+1)​个数。 3. 解法一:递推 ...

weixin_45488518的博客 582

lletcode杨辉三角II

1.暴力解法 设二维数组存储元素,并利用A[i][j]=A[i-1][j-1]+A[i-1][j] 代码如下: class Solution { public: vector<int> getRow(int rowIndex) { if(rowIndex==0) return {1}; vector<vector&lt...

天启的博客 157

(noip2011)计算系数

题目传送门sxazr 本题可用杨辉三角来做,也可以直接用组合数公式来求(要用费马小定理,时间快,空间占的少),我来说下杨辉三角的做法 先求出题目K次方的系数分f[k][i] 输出f[k][m]%MOD(注意是m)*a^n *b^m%MOD; 开long long 防炸也可不用 代码 在这里插入代码片 ```#include <cstdio> #include <iostream&...

7泽要努力吖 552

常见算法题型之数论基础:杨辉三角

常见算法题型之数论基础:杨辉三角

2401_87563614的博客 579

HDU 5698 瞬间移动【组合数+逆元】

题目链接 题意:从(1,1)走到(n,m),每次只能走右下方的格子,不包括右边和下边,问共有多少种走法。 大概列一列可以发现是个杨辉三角,(n,m)的格子是杨辉三角中n+m-3层的第m-1个数。而杨辉三角中第n层的第m个数为(n-1)C(m-1),所以答案就是(n+m-4)C(m-2)。然后因为要模1e9+7,再对分母的两个数求下逆元就可以了。 #include #include #in

hxh的博客 343
上一篇: 巧用组合数证明平方和、立方和
下一篇: [Django]views中视图函数获取不到form表单提交的文件,request.FILES为空
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值