题目描述
给定一个非负整数 $numRows$,请产生帕斯卡三角形的前 $numRows$ 行。
在帕斯卡三角形中,每个数是上方两个数的和。
样例
输入:5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
算法
(递推) $O(n^2)$
从上到下依次计算每一行;
对于每一行,先把1放在首位两个位置,然后计算中间的数:f[i][j] = f[i-1][j-1] + f[i-1][j]
;
时间复杂度分析:假设共有 $n$ 行,则总共需要计算 $n * (n+1) / 2$ 个数,计算每个数的时间复杂度是 $O(1)$,所以总时间复杂度是 $O(n^2)$。
C++ 代码
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> res;
if (!numRows) return res;
res.push_back(vector<int>(1, 1));
for (int i = 1; i < numRows; i ++ )
{
vector<int> &last = res.back();
vector<int> temp;
temp.push_back(1);
for (int i = 0; i + 1 < last.size(); i ++ )
temp.push_back(last[i] + last[i + 1]);
temp.push_back(1);
res.push_back(temp);
}
return res;
}
};
Y总你好呀
vector[HTML_REMOVED] &last = res.back(); 这里为 为什么要用引用?
vector[HTML_REMOVED] last = res.back(); 这样试了下也能通过~
不加引用会把
vector<int>
整个复制一遍给last
,加了引用之后就可以省去这一次复制的过程了,效率更高。谢谢Y总!!回答的真及时~~~~
不客气