此题为自己解答,如有不对,请大神指点迷津
题目
给定一个非负整数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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思想
根据杨辉三角形特征:
- 每一行第一个元素和最后一个元素均为1
- 每一行的元素个数与当前行数相等
- 中间元素均为当前元素的左上方和右上方元素之和
由此我们可以推算出,只要知道上面一行的所有元素,就能求出当前行的元素
算法
在这一题很简单,当然是对于数组和循环来说。用递归就稍微难了一些。
首先,先设置一个保存所有行的List,然后排出第一行,剩下的按照特征添加元素。
/**
* @ClassName Solution
* @Description 杨辉三角
* @Author XXX
* @Date 2020/3/31 20:08
* @Version 1.0
**/
public class Solution {
public List<List<Integer>> generate(int numRows) {
//杨辉三角总和
List<List<Integer>> all = new ArrayList<>(numRows);
//判断numRows是不是为小于1的数
if(numRows <= 0) {
return all;
}
//第一行总是为1
all.add(new ArrayList<>());
all.get(0).add(1);
//新一行
List<Integer> newRow = null;
//上一行
List<Integer> previous = null;
for (int i = 1; i < numRows; i++) {
newRow = new ArrayList<>();
if (i == 1) {
//每一个行第一个元素总是1
newRow.add(1);
//每一行最后一个元素总是1
newRow.add(1);
} else {
previous = all.get(i-1);
//每一个行第一个元素总是1
newRow.add(1);
//添加中间元素
for (int b = 1; b < i; b++) {
newRow.add(previous.get(b-1) + previous.get(b));
}
//每一行最后一个元素总是1
newRow.add(1);
}
//将新一行的数据添加到list
all.add(newRow);
}
return all;
}
}
说实话,这个算法不算是递归,应该还属于循环,由于还没有想出来递归到底怎么写才好,所以只能暂时这样写。
该算法在LeetCode中的结果
用时:1ms
内存消耗:37.6MB
更新时间:2020年4月6日
杨辉三角第二版算法
与上一版本的区别在于这一版本用了递归的方法,上一版本用的是循环。
废话不多说,直接上最新源代码
public class Solution {
/**
* 第二版专用
*/
private List<List<Integer>> all = null;
public List<List<Integer>> generate(int numRows) {
//判断输入的行数是否符合要求
if (numRows < 1) {
return new ArrayList<>(numRows);
}
//判断all中是否为空
if (all == null) {
all = new ArrayList<>(numRows);
}
//判断总List的长度是否达标
if (all.size() >= numRows) {
return all;
}
List<Integer> each = null;
List<Integer> previous = null;
if (all.size() < 1) {
each = new ArrayList<>(1);
all.add(each);
all.get(0).add(1);
} else {
int length = all.size();
previous = all.get(length - 1);
each = new ArrayList<>(length);
each.add(1);
for (int a = 1; a < previous.size(); a++) {
each.add(previous.get(a - 1) + previous.get(a));
}
each.add(1);
all.add(each);
}
all = generate(numRows);
return all;
}
}
该算法在LeetCode中的结果
用时:0ms
内存消耗:37.7MB
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。