一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情。
一、题目
给定一个非负整数 numRows, 生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re…
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、 思路
思路1
-
暴力解法
-
首先组合二维数组,通过new Array循环组成二位数组fill填充为1
-
双循环
-
第一层拿到二维数组每行长度len
-
第二层,由图可知,中间数是由当前上一行的当前下标值和前一个下标值的和
-
同时赋值的不包括第一位和最后一位,以及赋值是从第二行开始的
-
因此
-
if((j != 0 && j != len - 1) && i > 1) {
-
newArr[i][j] = newArr[i-1][j-1] + newArr[i-1][j]
-
}
-
最后return newArr
思路2
- 使用while
- 思路基本和上边一样,要注意的是fast的边界值,
三、代码
思路1代码
let numRows = 5
// let numRows = 1
let generate = function(numRows) {
/**
* 暴力解法
* 首先组合二维数组,通过new Array循环组成二位数组fill填充为1
* 双循环
* 第一层拿到二维数组每行长度len
* 第二层,由图可知,中间数是由当前上一行的当前下标值和前一个下标值的和
* 同时赋值的不包括第一位和最后一位,以及赋值是从第二行开始的
*
* 因此
* if((j != 0 && j != len - 1) && i > 1) {
* newArr[i][j] = newArr[i-1][j-1] + newArr[i-1][j]
* }
*
* 最后return newArr
* */
const newArr = new Array(numRows).fill(1).map((item, index) => new Array(index+1).fill(1))
for(let i = 0; i < numRows; i++) {
let len = newArr[i].length
for(let j = 0; j < len; j++) {
if((j != 0 && j != len - 1) && i > 1) {
newArr[i][j] = newArr[i-1][j-1] + newArr[i-1][j]
}
}
}
return newArr
}
generate(numRows)
思路2代码
let numRows = 5
// let numRows = 1
let generate = function(numRows) {
/**
* 使用while
* 思路基本和上边一样,要注意的是fast的边界值,
*
* */
const newArr = new Array(numRows).fill(1).map((item, index) => new Array(index+1).fill(1))
let fast = 0
while(fast < numRows) {
let len = newArr[fast++].length, slow = 0
while(slow < len) {
if(fast > 1 && fast < numRows && (slow > 0 && slow < len)) {
newArr[fast][slow] = newArr[fast-1][slow-1] + newArr[fast-1][slow]
}
slow++
}
}
return newArr
}
generate(numRows)