小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode118-杨辉三角
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
给定一个非负整数 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
杨辉三角作为编程界的入门题目,想必和helloworld一样经典。几乎所有的程序员在学习编程时都要练习杨辉三角的相关编程题目。杨辉三角本身是一个数学上的公式,也就是下一行的值等于上一行对应的两个数相加的和,而每一行最边两个数组均为1.由于这个特性可以分析出杨辉三角第一行和第二行具有特殊的性质,尤其是第一行。因此本题的解题思路为先定义一个二维数组,数组内容为每一行的值。而每一行的值又是一个数组类型,内容为杨辉三角的值。利用所需行数目作为循环的次数,每次循环生成对应行的值。同时对于0和1进行特殊处理。每一行都通过前一行计算,计算后再补足需要的1.则生成对应的杨辉三角形。
代码如下:
List<List<Integer>> result = new ArrayList();
public List<List<Integer>> generate(int numRows) {
for (int i = 0; i < numRows; i++) {
if(i == 0){
List<Integer> item = new ArrayList<>();
item.add(1);
result.add(item);
}else if(i == 1){
List<Integer> item = new ArrayList<>();
item.add(1);
item.add(1);
result.add(item);
}else{
Integer past = -1;
List<Integer> item = new ArrayList<>();
for (int j = 0; j < result.get(i - 1).size(); j++) {
if(j == 0){
item.add(result.get(i - 1).get(j));
}else{
item.add(result.get(i - 1).get(j) + past);
}
past = result.get(i - 1).get(j);
}
item.add(1);
result.add(item);
}
}
return result;
}
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。