题目:
Given a non-negative integer numRows, generate the first numRows of Pascal’s triangle.
In Pascal’s triangle, each number is the sum of the two numbers directly above it.
Example:
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
博主写的初步解法:
已知根据上一层的数据可以求出下一层的数据
这里设arr1为上一层的数组,arr2为下一层的数组
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function(numRows) {
let arr = [];
let arr1 = [], arr2 = [1];
for (let i = 1; i <= numRows; i++) {
// 替换上一层的数组
arr1 = [].concat(arr2);
arr.push(arr1);
for(let j = i; j > 0; j--) {
// 每层数组的开始和结尾数据都为1
arr2[0] = 1;
arr2[i] = 1;
if (j > 0 && j < i) {
// 除开始和结尾数据以外的其他数据都等于上一层的两个数据的和
arr2[j] = arr1[j - 1] + arr1[j];
}
}
}
return arr;
};
上面那种解法在时间上是没有问题的,但是运用了两个数组,占用了更多内存。实际上arr1是没有必要的,可以直接在arr2上进行修改,因为往下的每一层数据都在递增,所以不存在数组中数据丢失的问题。
这里我们把arr1和arr2换成一个数组arr1,解法如下:
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function(numRows) {
let arr = [];
let arr1 = [1];
for (let i = 0; i < numRows; i++) {
for(let j = i; j > 0; j--) {
if (j === i) {
// 每行末尾值等于上一行的末尾值
arr1[j] = arr1[j - 1]
} else if (j === 0) {
// 每行的开始值等于1
arr1[j] = arr1[0]
} else {
arr1[j] = arr1[j - 1] + arr1[j];
}
}
arr.push([].concat(arr1));
}
return arr;
};