「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。
题目
链接:leetcode-cn.com/problems/pa…
给定一个非负整数 _numRows,_生成「杨辉三角」的前 _numRows _行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1 输出: [[1]]
提示:
1 <= numRows <= 30
思路1
1.生成数阵对应的数组结构,并且把数组都初始化为1,解决边界问题
let count =new Array(n)
for(var i=0;i<n;i++){
count[i]=new Array(i+1).fill(1)
}
2.处理数组
1.显然当n<2时无需处理
2.当n>=2时,需要遍历数组处理每一行的 1~count[i].length-2个元素
代码
/**
* @param {number} numRows
* @return {number[][]}
*/
const generate=(n)=>{
let count =new Array(n)
for(var i=0;i<n;i++){
count[i]=new Array(i+1).fill(1)
}
if(n<2) return count
for(var i=2;i<count.length;i++)
for(var j=1;j<count[i].length-1;j++)
count[i][j]=count[i-1][j-1]+count[i-1][j]
return count
}
思路2
第一步:遍历层数
第二步:遍历每一层的每个数 然后赋值;
代码
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function(numRows) {
const res = [[1]];
let row = [];
for(let i=2; i<=numRows; i++) {
const last = res[res.length-1];
for(let j=0; j<i; j++) {
if(j===0){ //如果是当前层的第一个数 赋值1
row.push(1);
}else if(j===i-1){ //如果是当前层的最后一个数 赋值1;
row.push(1);
res.push(row.slice());
row = []
}else{ //否则 赋值为 前一层的前一位加当前位的数之和;
row.push(last[j-1]+ last[j])
}
}
}
return res;
};
思路3
看注释
const generate = numRows => {
if (numRows === 1) return [[1]];
const res = [[1]];
// i代表行,j代表每行的元素
for (let i = 1; i < numRows; i++) {
// 定义当前行
const row = [];
for (let j = 0; j <= i; j++) {
// left左上角元素
// left为上一行的、前一个j
// 如果不存在就赋值0
const left = res[i - 1][j - 1] || 0;
// right右上角元素
// right为上一行的、当前j
const right = res[i - 1][j] || 0;
// 当前元素为 左上角元素 + 右上角元素
row.push(left + right);
}
// 把当前行加入res
res.push(row);
}
return res;
};
思路4
- 令行数为r,列数为c,数组为arr的话,不难发现:arr[r][c]=arr[r-1][c-1]+arr[r-1][c]
- 需要注意的是,第一行由于r-1不存在,需要设为1,
- 另外如果c-1为-1的话值也不存在,需要设为0
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function(numRows) {
var res = [];
for (let i = 0; i < numRows; i++) {
var tempArr = [];
for (let j = 0; j <= i; j++) {
var sum = 0;
if (!res[i - 1]) {
sum = 1;
} else {
let left = res[i - 1][j - 1] || 0;
let right = res[i - 1][j] || 0;
sum = sum + left + right;
}
tempArr.push(sum || 1);
}
res.push(tempArr);
}
return res;
};