【LeetCode】探索杨辉三角模型

这篇具有很好参考价值的文章主要介绍了【LeetCode】探索杨辉三角模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

一、题目描述

力扣原题

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

  • 首先我们要来了解一下题目本身在说些什么,通过下方的动图我们可以更加清楚地看到杨辉三角是怎样一步步生成的。给到的示例中我们通过输入杨辉三角的行数,然后通过计算得到这个杨辉三角的每一行是什么具体的数值

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

二、模型选择

首先我们要做的第一件事就是去选择正确的求解模型

  • 首先第一点,我们要来对比一下使用C语言求解和C++求解有什么不同,以下是题目已经给出的函数接口

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

  • 如果读者有学习过 C语言的指针 和 C++的引用 的话就可以知道,C++的祖师爷为什么要发明出引用这个东西,目的就是为了脱离C语言中非常繁杂的指针

我可以试着来分析一下如何使用C语言来进行求解,首先我们来看到的是这个 返回值int**

  • 为什么要返回int**呢,原因就在于对于我们这个杨辉三角来说,虽然呈现的是一个三角形的样子,但是呢其底层的实现其实还是一个二维数组,所以在函数内部我们肯定要去开辟出一个二维数组,读者可以通过下面这张图再来回顾一下有关二级指针的知识点(忘记了可以去看看指针相关文章)

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

  • 看完了返回值后,我们再来看看另外的两个参数,第一个是这个returnSize,其代表的是整个二维矩阵的行数,而returnColumnSizes代表的则是每一行的列数。
  • 但为何它们的类型一个是一级指针int*,另一个则是二级指针int**呢?如果你有看过 二叉树练习题之二叉树的遍历 的话就可以知道它们都叫做输出型参数

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

  • 在讲解 函数栈帧 的时候我们说到过这个函数的形参是实参的一份临时拷贝,内部形参的改动是不会影响实参的,所以我们在做二叉树题目的时候如果对这个参数没有做特殊处理的话在不同的递归层中就会出现 覆盖问题
  • 所以我们若是想让形参内部的变化带动外部一起修改的话,就需要外部传递变量的地址进来,那对于地址而言就需要使用 指针 来进行接收,一级指针的地址就需要二级指针来接收

所以就这么来看,我们若是使用C语言来求解本题的话,就会变得很麻烦

  • 那这个时候就可以使用我们心爱的C++了💖
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        
    }
};
  • 在C++中呢,我们一般不会使用指针来模拟二维数组,而是会采取vector<vector<int>>来进行表示

三、思路分析 + 代码详解

接下去我们就来分析一下这道题的思路🔍

  • 还记得下面这个动图吗,仔细观察我们可以发现每一行的第一个和最后一个数字都是1。而且中间空缺处的方块都是其 左上方的数字 + 右上方的数字

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

  • 具体地可以看以下的图示

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学
【思路简述】:说一下我是如何去求解这道题的

  • 首先的话我们肯定需要先去定义出一个有关vector的二维矩阵
vector<vector<int>> vv;
  • 接下去呢便要为这个二维矩阵开辟出合适的大小来容纳,这里便可以使用到我们在vector中所学习的【resize】接口,既改变了size,又改变了capacity
vv.resize(numRows);
  • 因为矩阵中的每一行的第一个元素和最后一个元素都是1,所以我先去遍历这个矩阵,将所有的值设置为0,接下去呢再固定地将每一行的第一个元素vv[i][0]和最后一个元素vv[i][i]都设置为1
for(size_t i = 0;i < vv.size(); ++i)
{
    // 首先将二维数组中的所有元素初始化为0
    vv[i].resize(i + 1, 0);
    // 然后将每一行的第一个和最后一个元素初始化为1
    vv[i][0] = vv[i][i] = 1;
}
  • 接下去呢,就要去计算每一行的具体数值了,通过两层for循环去遍历这个二维矩阵,接下去呢我们只对数值为0的位置进行修改,因为每行的第一列和最后一列已经为1了,所以我们去修改的只是中间的那一部分
for(size_t i = 0;i < vv.size(); ++i)
{
    for(size_t j = 0;j < vv[i].size(); ++j)
    {
        if(vv[i][j] == 0)
        {
            // 右上方:vv[i - 1][j]
            // 左上方:vv[i - 1][j - 1]
            vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
        }
    }
}

对于当前的这个值就等于其上方的那一个数和上方左侧的那一个数之和

vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];

整体代码展示:

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> vv;
        vv.resize(numRows);

        for(size_t i = 0;i < vv.size(); ++i)
        {
            // 首先将二维数组中的所有元素初始化为0
            vv[i].resize(i + 1, 0);
            // 然后将每一行的第一个和最后一个元素初始化为1
            vv[i][0] = vv[i][i] = 1;
        }

        for(size_t i = 0;i < vv.size(); ++i)
        {
            for(size_t j = 0;j < vv[i].size(); ++j)
            {
                if(vv[i][j] == 0)
                {
                    // 右上方:vv[i - 1][j]
                    // 左上方:vv[i - 1][j - 1]
                    vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
                }
            }
        }
        return vv;
    }
};

运行结果:

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学

【LeetCode】探索杨辉三角模型,LeetCode算法笔记,leetcode,c++,数学文章来源地址https://www.toymoban.com/news/detail-624525.html

到了这里,关于【LeetCode】探索杨辉三角模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode | 杨辉三角 | 电话号码配对

       电话号码的字母组合 杨辉三角                                                                                                                                                                                                                   

    2024年02月22日
    浏览(26)
  • leetcode--杨辉三角(C、C++)

    2024年02月15日
    浏览(28)
  • ***杨辉三角_yyds_LeetCode_python***

    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows = 1 输出: [[1]] 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/pasc

    2024年02月08日
    浏览(29)
  • 【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

    ✨个人主页:bit me ✨当前专栏:数据结构 ✨每日一语:不要等到了你的人生垂暮,才想起俯拾朝花,且行且珍惜。 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows = 5 输出: [[1],[1,1

    2024年02月03日
    浏览(33)
  • 算法详解:杨辉三角 | 合并俩个有序数组 | 删除有序数组中的重复项

    前言:本次分享题目全部来自力扣网,大家可以自行选择挑战,详细链接: 118. 杨辉三角 - 力扣(LeetCode) 88. 合并两个有序数组 - 力扣(LeetCode) 26. 删除有序数组中的重复项 - 力扣(LeetCode) 目录 一.杨辉三角 思路: 完整代码: 二.合并俩个有序数组 思路: 完整代码: 三

    2024年02月05日
    浏览(33)
  • 每日一题,杨辉三角

    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 示例 1: 示例 2:

    2024年02月04日
    浏览(29)
  • C练习——杨辉三角

    题目: 打印近似杨辉三角,行数n自选 百度找的杨辉三角,参考一下: 解析: 把它的全部元素左对齐,就可以看成近似杨辉三角的样子 1 1  1 1  2  1 1  3  3  1 1  4  6  4  1 ……  每个数等于它上方两数之和 每行数字左右对称,由1开始逐渐变大 行数与列数相同,第n行有

    2024年01月17日
    浏览(28)
  • 杨辉三角(Java)

     实现思路:我们可以先把杨辉三角想象成一个空的二维数组,然后再给它赋值输出即可。 关键在于如何赋值:仔细观察上图可以得出除了 每一行第一个数以及最后一个数(都是1) , 中间的数字规律就是: a[ i ][ j ] = a[ i - 1 ][ j - 1 ] + a[ i - 1 ][ j ] 实现代码: 相信大家更多的

    2024年02月08日
    浏览(26)
  • 动态规划-杨辉三角

    该算法题分别是: 118. 杨辉三角。 119. 杨辉三角 II 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 1.2.1 示例 1: 输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 1.2.2 示例 2: 输入: numRows = 1 输出: [[1]] 1.2.3 提示: 1 = numRows = 30 来源:力扣(LeetCode) 链接:https://

    2024年02月13日
    浏览(28)
  • 打印杨辉三角

    这个公式,不好算,我觉得还是杨辉三角算起来方便:c#代码如下:    double 打印杨辉三角(int n)//n必须是偶数,展开项是n+1,中间项是n/2,此处返回中间项的概率202306131722         {             //for (int i = 0; i n; i++)             //{             //    //这种方法直接算,使

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包