vector:c++:杨辉三角(力扣)

目录

题目:

解题思路:

第一步:创建行和列

第二步:给首尾赋值

第三步:中间数

 总代码:


题目:

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

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

 

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

解题思路:

实际上思路很简单,中间的每个数字,就是他的上一行同位置的数据,+上一行同位置数据-1的位置的数据。

列如第三行的’2’,他的坐标是[2][1],那么他就等于[1][1]+[1][0]处位置的数据,也就是1+1=2;

所以解题步骤如下:

第一步:创建行和列

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

有些同学可能不了解vector<vector<int>>这句话的意思。

简单来说是这样的:我们先把括号里面的vector<int>看成一个数据,

那么就是开辟了vector<数据>这样一个数组,也就是我们下面图中的对象数组,数组中存放着一个个数据。

然后每个数据又开辟了vector<某类型的数据>,如下图的int数组。

用通俗一点的理解,就是vector(开辟行)<vector<int>(每行元素个数)>

最后再根据题目已经给的numRows,用resize函数开辟列。

 

备注:如果不懂得resize函数的小伙伴可以看我的这篇文章c++:reserve和resize简介和区别_幻荼的博客-CSDN博客 

第二步:给首尾赋值

我们可以看到,杨辉三角的每行的第一个元素和最后一个元素都是0,所以我们这里给他赋值

for(size_t i=0;i<vv.size();i++)
        {
            vv[i].resize(i+1,0);//给每行开辟i个空间
            vv[i][0]=1;//给首字母赋值
            vv[i][vv[i].size()-1]=1;//给尾赋值,也可以写成VV[i][i]毕竟行和列相等
        }

 

第三步:中间数

刚才已经解释了中间数如何相加,这里直接给出代码

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][j]=vv[i-1][j-1]+vv[i-1][j];
                }
            }
        }

 总代码:

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++)
        {
            vv[i].resize(i+1,0);
            vv[i][0]=1;
            vv[i][vv[i].size()-1]=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][j]=vv[i-1][j-1]+vv[i-1][j];
                }
            }
        }
        return vv;
    }
};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值