「前端刷题」118. 杨辉三角

133 阅读1分钟

「这是我参与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;
        };