算法练习第36题-杨辉三角

180 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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)

四、测试结果

测试用例1

image.png

测试用例2

image.png