题目118
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
解法
var generate = function(numRows) {
// 给定值为0,首项是没有的要判断下
if(numRows === 0)return []
// 给定一个空数组
let arr = []
// 循环一维数组,数组的长度刚好是和给定值相等的,所以是i < numRows
for(let i = 0 ;i < numRows;i++){
// arr的第一项固定为[1]
arr[i] = [1]
// 循环二维数组,因为给定了第一个初始值为1,所以从索引为1开始,这个索引是可以和第一层索引相等的
for(let j = 1; j <= i ; j++){
// arr[3][2] = arr[2][1] + arr[2][2]
// 把图中每一项看成一个坐标,(3,2),
arr[i][j] = arr[i-1][j-1] + arr[i-1][j]
}
// 末尾项一直是1
arr[i][i] =1
}
return arr
};
题目119
给定一个非负索引 `rowIndex`,返回「杨辉三角」的第 `rowIndex` 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: rowIndex = 3
输出: [1,3,3,1]
解法1
var getRow = function(rowIndex) {
const k = rowIndex
const yangHui = [
[1],
[1,1]
]
if (k === 0 || k === 1) {
return yangHui[k]
}
for (let i = 2; i <= k; i++) {
for (let j = 0; j < i + 1; j++) {
if (!yangHui[i]) {
// 初始化数组
yangHui[i] = []
}
let m = yangHui[i-1][j-1] || 0
let n = yangHui[i-1][j] || 0
yangHui[i][j] = m + n
}
}
return yangHui[k]
};
解法2
提示
1
1 1
1 1 1
k = 2 时,创建一个长度为3的数组,数组的初始内容等于`[1,1, 1]`,从尾巴开始遍历。
1. `yangHui[1] = yangHui[1] + yangHui[0] = 1 + 1 = 2`,等于2。
1
1 1
1 2 1
杨辉三角的第二行,等于`[1,2,1]`
1
1 1
1 2 1
1 2 1 1
k = 3 时,创建一个长度为4的数组,数组的初始内容等于`[1,2,1,1]`,从尾巴开始遍历。
1. `yangHui[2] = yangHui[2] + yangHui[1] = 1 + 2 = 3`
1
1 1
1 2 1
1 2 3 1
2. `yangHui[1] = yangHui[1] + yangHui[0] = 2 + 1 = 3`
1
1 1
1 2 1
1 3 3 1
杨辉三角的第二行,等于`[1,3,3,1]`
var getRow = function(rowIndex) {
const k = rowIndex
const yangHui = [1, 1]
if (k === 0) {
return [1]
}
if (k === 1) {
return [1, 1]
}
for (let i = 2; i <= k; i++) {
// 每一行的首尾为1
yangHui[0] = yangHui[i] = 1
for (let j = i - 1; j > 0; j--) {
yangHui[j] = yangHui[j-1] + yangHui[j]
}
}
return yangHui
};