Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
力扣第118题 杨辉三角
如下所示:
给定一个非负整数 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
、第二层是自然数列
、第三层是三角数列
、三角数列相邻数字相加可得方数数列
等。
但由于我们这里只需要构造这个 杨辉三角
,所以只需要用到 最外层的数字始终是 1
这个特性。此外,我们发现 杨辉三角
的第 i
行的元素个数为 i+1
。
经上面的总结,我们就可以构造出这个 杨辉三角
了。大致的步骤为:使用双层 for
循环,外层的 for
循环用于构造第 i
行,内层的 for
循环用于构造第 i
行的第 j
个元素。(构造时如发现当前的元素是最外层元素,则赋值为 1 即可)
二、实现
实现代码
实现的代码与思路中保持一直,需注意数组的下标起始为 0
,即 arr[0][0]
表示第一行的第一个元素。
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<>();
for (int i=0; i<numRows; i++){
List<Integer> temp = new ArrayList<>();
for (int j=0; j<i+1; j++){
if (j == 0 || j==i){ // 边缘元素
temp.add(1);
} else { // 非边缘元素
temp.add(ret.get(i-1).get(j-1) + ret.get(i-1).get(j));
}
}
ret.add(temp);
}
return ret;
}
测试代码
public static void main(String[] args) {
new Number118().generate(5);
}
结果
三、总结
碰到这种简单题我们直接重拳出击即可,我一开始还想使用递归来解决这一题,仔细一想后发现根本没有必要使用递归来实现。
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~