这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战
题目描述
提供一个正整数numRows,需要你返回杨辉三角的前numRows行,以数组的形式返回。
什么是杨辉三角?
就是左斜边和右斜边都是1,然后空白的地方是等于上一级的左上方和右上方相加的值。
// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
// 1 5 10 10 5 1
如果numRows为 1,则返回 [[1]]
如果numRows为3,则返回 [[1], [1,1], [1,2,1]]
思路分析
第一种方法
题目的要求是要生成前numRows行的杨辉三角,然后每一行都是根据上一行得到下一行,所以我们可以一行一行的遍历生成,直到numRows。
另外有个规律,第numRows行,当前行也有numRows个元素。
我们新建个数组arr,然后需要嵌套遍历2次,一次是numRows行的杨辉三角,一次是每一行的杨辉三角,所以最后返回的是二维数组。
第一个遍历,新建item数组,默认值是1。
第二个遍历,然后索引从1开始,取上一层的当前索引的前一个和后一个,相加后push到item中。
第二个遍历只需遍历到第一个的索引就行。
第二个遍历后
如果当前索引不是0,则往item里面push1。
然后把item push 到数组arr中。
最终返回到数组arr,就是需要的杨辉三角。
代码如下:
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function (numRows) {
const arr = []
for (let i = 0; i < numRows; i++) {
const item = [1]
for (let j = 1; j < i; j++) {
const a = arr[i - 1][j - 1]
const b = arr[i - 1][j]
item.push(a + b)
}
if (i !== 0) {
item.push(1)
}
arr.push(item)
}
return arr
};
第二种方法
这个方法的思路也是跟第一种方法类似,它是通过while循环实现的
然后它在第一个循环的时候每次都新建当前索引+1长度的数组,并填充1。
然后第二个循环只需要覆盖除了首尾的元素,此时首尾都是1,无需其他操作
第二个循环后直接把item push到数组arr中
遍历结束后返回arr就行。
代码如下:
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function (numRows) {
const arr = []
let i = 0
while (i < numRows) {
let item = new Array(i + 1).fill(1)
let j = 1
while (j < i) {
item[j] = arr[i - 1][j - 1] + arr[i - 1][j]
j++
}
arr.push(item)
i++
}
return arr
};