leetcode每天一题:【杨辉三角】(简单)

130 阅读2分钟

这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

提供一个正整数numRows,需要你返回杨辉三角的前numRows行,以数组的形式返回。

什么是杨辉三角?

image.png

就是左斜边和右斜边都是1,然后空白的地方是等于上一级的左上方和右上方相加的值。

//  1
// 1  1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1 
// 1 5 10 10 5 1

如果numRows1,则返回 [[1]]

如果numRows3,则返回 [[1], [1,1], [1,2,1]]

思路分析

第一种方法

题目的要求是要生成前numRows行的杨辉三角,然后每一行都是根据上一行得到下一行,所以我们可以一行一行的遍历生成,直到numRows。

另外有个规律,第numRows行,当前行也有numRows个元素。

我们新建个数组arr,然后需要嵌套遍历2次,一次是numRows行的杨辉三角,一次是每一行的杨辉三角,所以最后返回的是二维数组。

第一个遍历,新建item数组,默认值是1

第二个遍历,然后索引从1开始,取上一层的当前索引的前一个和后一个,相加后push到item中。

第二个遍历只需遍历到第一个的索引就行。

第二个遍历后

如果当前索引不是0,则往item里面push1

然后把item push 到数组arr中。

最终返回到数组arr,就是需要的杨辉三角。

代码如下:

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function (numRows) {
  const arr = []
  for (let i = 0; i < numRows; i++) {
    const item = [1]
    for (let j = 1; j < i; j++) {
      const a = arr[i - 1][j - 1]
      const b = arr[i - 1][j]
      item.push(a + b)
    }
    if (i !== 0) {
      item.push(1)
    }
    arr.push(item)
  }
  return arr
};

image.png

第二种方法

这个方法的思路也是跟第一种方法类似,它是通过while循环实现的

然后它在第一个循环的时候每次都新建当前索引+1长度的数组,并填充1。

然后第二个循环只需要覆盖除了首尾的元素,此时首尾都是1,无需其他操作

第二个循环后直接把item push到数组arr中

遍历结束后返回arr就行。

代码如下:

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function (numRows) {
  const arr = []
  let i = 0
  while (i < numRows) {
    let item = new Array(i + 1).fill(1)
    let j = 1
    while (j < i) {
      item[j] = arr[i - 1][j - 1] + arr[i - 1][j]
      j++
    }
    arr.push(item)
    i++
  }
  return arr
};

image.png