持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
前言
算法里的经典题目杨辉三角它来了,以前上学的使用用c写过,今天用js写一下。
题目描述
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
解题思路
杨辉三角是一道非常有意思的题目,解题的主要思路有一下几点
- 首先要处理特殊情况,那就是当输入小于2的时候,这时候分为两种情况,直接返回[[1]]和直接返回[[1],[1,1]]。
- 当输入大于2的时候的处理大致思路是使用双层for循环,外层循环控制杨辉三角的层数,内层循环控制每层中的数
- 这里要特别注意的一点是不论是杨辉三角的那一层,它的头部和尾部都是1,所以要对这部分做特殊处理 代码如下:
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function(numRows) {
if(numRows===1){
return [[1]]
}
if(numRows===2){
return [[1],[1,1]]
}
let result = [[1],[1,1]]
let arrNum = [] //用来记录当前层的数据
for(let i=2;i<numRows;i++){
for(j=0;j<i+1;j++){
if(j===0||j===i){
arrNum.push(1)
}else{
arrNum.push(result[i-1][j-1]+result[i-1][j])
}
}
result.push(arrNum)
arrNum=[]
}
return result
};
运行结果如下:
如果不想特殊处理上述的输入小于2的情况,可以如下代码操作
var generate = function(numRows) {
let result = []
for(let i=0;i<numRows;i++){
const arrNum = new Array(i + 1).fill(1);
for(j=1;j<arrNum.length-1;j++){
arrNum[j] = result[i - 1][j - 1] + result[i - 1][j];
}
result.push(arrNum)
}
return result
};
这里的操作是在每次循环之前都把arrNum声明一遍,并且arrNum的每一项都声明为1,所以就不用对输入小2的情况做特殊的处理了,但其实差别不大,看个人喜好了。
总结
杨辉三角还是挺有意思的,它把二项式系数精确的以图的形式给展现了出来,不得不惊叹古人的智慧,做题还是要多考虑各种情况,特别是那些个特殊的情况,希望以后可以做到不再面向测试编程,gogogo