题目描述
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
有两种方案解决
第一种
借助二维数组来实现, 一般实现最方便的就是二维数组, 下标为 0 和 对角线上元素 均为 1 ,其他元素都是自己肩上的元素之和, 比如示例 第三行 的 2 就是他肩上 两个元素 1 + 1 得来的。使用二维数组的主要几个公式如下:
下面 arr 表示数组 i 表示 当前行 j 表示当前列
arr[i][j] = arr[i-1][j-1] + arr[i-1][j]
代码如下
package ArraysProblems;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class SolutionX118{
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new ArrayList<>();
// 使用数组
int [][] arr = new int[numRows][];
// 开始初始化并创建杨辉三角
for(int i = 0;i < numRows; i++){
// 初始化内层数组 一维数组
int []secondArr = new int[i+1];
// 初始化 0 位 和 对角线位
secondArr[0] = secondArr[i] = 1;
// 内层数组传给 一维 初始化二维数组
arr[i] = secondArr;
// 开始初始化非 1 数值位
if(i>=2){
for(int j = 1; j < i; j++){
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
for(int i = 0; i < numRows; i++){
// 创建列表进行保存
ArrayList arrayList = new ArrayList();
for(int j = 0; j <=i ;j++){
arrayList.add(arr[i][j]);
// System.out.print(arr[i][j]+",");
}
list.add(arrayList);
}
// 下面是打印语句
// Iterator it = list.iterator();
// while (it.hasNext()){
// System.out.println("结果:"+it.next());
// }
return list;
}
}
public class JavaDemo2 {
public static void main(String[] args) {
SolutionX118 sx = new SolutionX118();
sx.generate(5);
}
}
资源耗费情况
时间 | 内存 |
---|---|
1ms | 34.8MB |
时间上打败了97%多的人, 内存使用上打败了 24%的人。
下面来看看第二种方法
第二种
第二种方法其实和第一种方法,大同小异, 只是没有开辟二维数组罢了,使用的原理是一样的, 不过有意思的是, 和第一种方法相比,在时间和空间上并未有太大的改观。
代码如下
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class SolutionY118{
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new ArrayList<>();
if(numRows == 0)
return list;
// 开始初始化并创建杨辉三角
// list.add((ArrayList)arr);
for(int i = 0; i < numRows; i++){
ArrayList arrayList = new ArrayList();
// arr[0] = 1;
arrayList.add(1); // 初始化第一位 下标 0 位
list.add(arrayList); // 将整个数组添加进去 后面要用到
if(i==1){ // 从 第3 行 开始进行加和 所以 第二行 即下标 1 的行 要保证有两个数 1
arrayList.add(1);
}
if(i>=2){
for(int j = 1; j < i; j++){
arrayList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
}
arrayList.add(1);
}
}
// Iterator it = list.iterator();
// while (it.hasNext()){
// System.out.println("结果:"+it.next());
// }
return list;
}
}
资源耗费情况
时间 | 内存 |
---|---|
1ms | 34.3MB |
时间上打败了99.88%多的人, 内存使用上打败了 25.86%的人。
个人感觉没法再小了, 已经尽量没开辟空间,由于这是必须要返回的值,后来看了官方解答,差不多也是 有使用35.8MB左右内存。