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