LeetCode 118题解 | 杨辉三角
题目链接: https://leetcode.cn/problems/pascals-triangle/description/
题目如下:
解题过程如下:
杨辉三角就是一个不规则的二维数组,实际上是一个直角三角形。如图所示:
杨辉三角特点:每一行的第一个和最后一个都是1,中间这些位置的数值等于上一行同下标的数值和前一个下标的数值之和。
这道题用C++实现比用C语言实现简单很多,我们先来看看用C语言实现的难度在哪?
题中说了所有的数组都需要动态开辟及其用完后释放,用C语言怎么动态开辟二维数组呢?——指针数组
指针数组就是存放指针的数组,在本题中存储的是整型指针的数组,数据个数是行数,这个数组当中的每一个指针都需要动态开辟一块空间存储各行数据。
代码中涉及二级指针、动态开辟以及释放,参数理解上也很困难。
而C++提供的代码就很简洁:
但是这里有一个相较陌生的类型vector<vector<int>>
,vector< vector < int >>相当于实例化出了两个类:
完整代码如下:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv(numRows);// 可以用构造开数组
// 也可以用resize开数组
/*vector<vector<int>> vv;
vv.resize(numRows);*/
// 二维数组的每个数据都为1
for (size_t i = 0; i < numRows; i++)
{
// vv.[i]表示下标为i的vector<int>对象,给每个vector<int>对象插入数据
vv[i].resize(i + 1, 1);
}
// 中间的位置的值等于上一行里同下标的值和前一个下标的值之和
for (size_t i = 0; i < numRows; i++)
{
// 每一行的第一个值和最后一个值已经是1了,不用管
for (size_t j = 1; j < vv[i].size() - 1; j++)
{
vv[i][j] = vv[i - 1][j] + vv[i -1][j - 1];
}
}
return vv;
}
};
由此可见,vector< vector < int >>底层相当于是int的二维数组。相较于C语言,用C++实现就不用开二维数组的空间,直接调用vector的接口就行,也不需要返回二维数组有多少行,每一行有多少个。
简单解释一下vv[i][j]
:
C语言中用下标[]访问本质是解引用。这里访问是调用了两次函数,效率会怎么样呢?因为是高频调用的短小函数,必然会把这两个运算符重载定义在类里成为内联,所以效率问题不用担心。