算法练习第37题- 杨辉三角 II

179 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

一、题目

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

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

示例 1:

输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:

输入: rowIndex = 0
输出: [1]
示例 3:

输入: rowIndex = 1
输出: [1,1]

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

思路1

  • 双指针
  • 首先根据rowIndex定义总行数 numRows = rowIndex + 1
  • 然后创建二位数组,内容填充值为1
  • 快指针遍历每行数组的长度 定义慢指针
  • 由于内容填充值是由上一行的当前值以及前一个坐标值的和
  • 因此要定义区间快指针大于1且小于numRows, 慢指针大于0且小于当前行数的长度
  • 循环结束得到二维数组
  • 最后通过下标拿到当前行

思路2

  • 解题方式相同
  • 不需要使用指针,直接通过双循环的i和j遍历和赋值

三、 代码编写

思路1

let rowIndex = 3
let getRow = function(rowIndex) {
  /**
   * 双指针
   * 首先根据rowIndex定义总行数 numRows = rowIndex + 1
   * 然后创建二位数组,内容填充值为1
   * 快指针遍历每行数组的长度 定义慢指针
   * 由于内容填充值是由上一行的当前值以及前一个坐标值的和
   * 因此要定义区间快指针大于1且小于numRows, 慢指针大于0且小于当前行数的长度
   * 循环结束得到二维数组
   * 最后通过下标拿到当前行
   * 
   * */ 

  let numRows = rowIndex + 1
  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[rowIndex]
};
getRow(rowIndex)

思路2

let rowIndex = 3
let getRow = function(rowIndex) {

  /**
   * 解题方式相同
   * 不需要使用指针,直接通过双循环的i和j遍历和赋值
   * 
   * */ 
  let numRows = rowIndex + 1
  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[rowIndex]

};
getRow(rowIndex)

四、测试结果

测试结果1

image.png

测试结果2

image.png