1. 题目
在「杨辉三角」中,每个数是它左上方和右上方的数的和。给定一个非负整数
numRows
,生成「杨辉三角」的前numRows
行。
2. 示例
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
3. 分析
1. 找规律:杨辉三角斜边上的元素都是1,除了两条斜边上的元素外,其他元素的值都为上方两个元素之和:
2. 映射到数据结构:可以把杨辉三角看成一个二维数组,可以用vector类定义一个二维数组,第几行就有几个元素
3. 如何实现
(1)用vector定义二维数组:vector<vector<int>> vv
(2)每一行元素个数不同,为二维数组每一行申请空间:resize( )
(3)将斜边上元素赋值为1:
① 最左边的斜边元素 vv[i][1] = 1;
② 最右边的斜边元素 vv[i][vv[i].size()-1] = 1; //vv[i].size()-1是每行最后一个元素的下标
(4)计算非斜边的元素值vv[i][j] = vv[i-1][j-1]+vv[i-1][j];
(5)注意题目要求的返回值类型
4. 代码实现
1. class Solution { 2. public: 3. vector<vector<int>> generate(int numRows) { 4. vector<vector<int>> vv; 5. vv.resize(numRows); 6. 7. for(size_t i = 0;i<vv.size();i++) 8. { 9. vv[i].resize(i+1); 10. } 11. 12. for(size_t i = 0;i<vv.size();i++) 13. { 14. vv[i][0] = vv[i][vv[i].size() - 1] = 1; 15. } 16. 17. for(int i = 0;i<vv.size();i++) 18. { 19. for(int j = 0;j<vv[i].size();j++) 20. { 21. if(vv[i][j] != 1) 22. { 23. vv[i][j] = vv[i-1][j-1] + vv[i-1][j]; 24. } 25. } 26. } 27. 28. return vv; 29. } 30. };