开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
描述
给定一个非负整数
numRows, 生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
- 示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
- 示例 2:
输入: numRows = 1
输出: [[1]]
- 提示:
1 <= numRows <= 30
解析
根据题意,我们只要理解杨辉三角的几个特性,本题还是很容易解决的,这里说一下我的理解。
-
杨辉三角的每一行的数量和行号是一致的
-
每一行的第一位和最后一位的值都是1,并且每行数字左右对称
-
假如当前是第i行,第j个元素:如果是最外侧的元素,那么这个元素的值都是1,如果是内部的元素,那这个元素的值是第i-1行处的第j位元素和第j-1位元素之和,简单说就是每一个数字都等于上一行左右两个数字之和
Java解题过程如下:
class Solution {
public List<List<Integer>> generate(int numRows) {
//定义结果集
List<List<Integer>> ret = new ArrayList<List<Integer>>();
//需要执行的行数
for (int i = 0; i < numRows; ++i) {
//定义每一行
List<Integer> row = new ArrayList<Integer>();
//内层循环为列
for (int j = 0; j <= i; ++j) {
//第一列和最后一列都为1,直接添加到row中
if (j == 0 || j == i) {
row.add(1);
} else {
//非第一和最后一个的数据值是:上一行相同下标及相同下标前一个数据之和
row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j));
}
}
//添加当前行
ret.add(row);
}
//返回最终结果
return ret;
}
}
- 时间复杂度:O ( numRows*2)。
- 空间复杂度:O(1)。
运行结果:
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:39 MB, 在所有 Java 提交中击败了85.25%的用户