LeetCode118- 杨辉三角 | 算法练习系列

97 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

前言

算法里的经典题目杨辉三角它来了,以前上学的使用用c写过,今天用js写一下。

题目描述

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

image.png   示例 1:

输入: numRows = 5

输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1

输出: [[1]]

解题思路

杨辉三角是一道非常有意思的题目,解题的主要思路有一下几点

  • 首先要处理特殊情况,那就是当输入小于2的时候,这时候分为两种情况,直接返回[[1]]和直接返回[[1],[1,1]]。
  • 当输入大于2的时候的处理大致思路是使用双层for循环,外层循环控制杨辉三角的层数,内层循环控制每层中的数
  • 这里要特别注意的一点是不论是杨辉三角的那一层,它的头部和尾部都是1,所以要对这部分做特殊处理 代码如下:
/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function(numRows) {
    if(numRows===1){
        return [[1]]
    }
    if(numRows===2){
        return [[1],[1,1]]
    }
    let result = [[1],[1,1]]
    let arrNum = [] //用来记录当前层的数据
    for(let i=2;i<numRows;i++){
        for(j=0;j<i+1;j++){
            if(j===0||j===i){
                arrNum.push(1)
            }else{
                arrNum.push(result[i-1][j-1]+result[i-1][j])
            }
        }
        result.push(arrNum)
        arrNum=[]
    }
    return result
};

运行结果如下:

image.png 如果不想特殊处理上述的输入小于2的情况,可以如下代码操作



var generate = function(numRows) {
    let result = []
    for(let i=0;i<numRows;i++){
         const arrNum = new Array(i + 1).fill(1);
        for(j=1;j<arrNum.length-1;j++){
           arrNum[j] = result[i - 1][j - 1] + result[i - 1][j];
        }
        result.push(arrNum)
    }
    return result
};

这里的操作是在每次循环之前都把arrNum声明一遍,并且arrNum的每一项都声明为1,所以就不用对输入小2的情况做特殊的处理了,但其实差别不大,看个人喜好了。

总结

杨辉三角还是挺有意思的,它把二项式系数精确的以图的形式给展现了出来,不得不惊叹古人的智慧,做题还是要多考虑各种情况,特别是那些个特殊的情况,希望以后可以做到不再面向测试编程,gogogo