tags:
- 简单
- 参考
- 数组
- 动态规划
flag: yellow
style: summer
date: ‘2019-7-5’
118.杨辉三角
一、题目
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
- 示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解答
- 官方题解
方法:动态规划
思路
如果能够知道一行杨辉三角,我们就可以根据每对相邻的值轻松地计算出它的下一行。
算法
虽然这一算法非常简单,但用于构造杨辉三角的迭代方法可以归类为动态规划,因为我们需要基于前一行来构造每一行。
首先,我们会生成整个 triangle 列表,三角形的每一行都以子列表的形式存储。然后,我们会检查行数为 0 的特殊情况,否则我们会返回 [1]。如果 numRows > 0,那么我们用 [1] 作为第一行来初始化 triangle with [1],并按如下方式继续填充:
代码:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
// 合法性判断
if (numRows == 0) {
return triangle;
}
// 将第一行元素值置为1
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for (int rowNum = 1; rowNum < numRows; rowNum++) {
List<Integer> row = new ArrayList<>();
List<Integer> prevRow = triangle.get(rowNum-1);
// 每行的第一个元素值总为1.
row.add(1);
// 除了每行第一个和最后一个的其他三角元素的值
//总是等于其上一行的左边和上一行的右边元素和
for (int j = 1; j < rowNum; j++) {
row.add(prevRow.get(j-1) + prevRow.get(j));
}
//每行的最后一个元素值总为1
row.add(1);
triangle.add(row);
}
return triangle;
}
}
复杂度分析
执行用时 :1 ms, 在所有 Java 提交中击败了99.54%的用户
内存消耗 :35 MB, 在所有 Java 提交中击败了25.70%的用户