1、总结
- 下次还是先实现基础方法,再研究优化问题,这一道题由于我想总结出计算公式,卡了好久…
- 我感觉还是可以推断出计算公式的,只是现在刷题为重,先过…
- 文末发现一种有趣的计算方式,值得一看…
2、题目
Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal’s triangle.
Note that the row index starts from 0.
Example:
Input: 3
Output: [1,3,3,1]
3、我的解法
这题跟上一题其实是同一个性质,上一题要求返回整个杨辉三角,这一题要求返回第n行元素,仅此差异。
我已开始想复杂了,想说直接归纳出一个规律,然后根据对应的计算公式得出第n行元素的所有值,推导了前三个元素
// 1, k, k*(k-1)/2,
第四个元素就有点脑钝,后面一审题,发现是要求空间复杂度O(n),不是要求时间复杂度O(n),于是反应过来就是上一题的解法,重复上一题的步骤,修改返回结果即可。
/**
* @param {number} rowIndex
* @return {number[]}
*/
// 方法一:
var getRow = function(rowIndex) {
let result = [];
for(let i = 0; i <= rowIndex; i++) {
result[i] = [];
for(let j = 0; j <= i; j++){
if(j == 0 || j == i) {
result[i][j] = 1;
} else {
result[i][j] = result[i-1][j-1] + result[i-1][j];
}
}
}
return result[rowIndex];
};
4、其他人的解法
找到一个递归实现的方法,时间复杂度差一点,空间复杂度好一点:
/**
* @param {number} rowIndex
* @return {number[]}
*/
// 方法二:
var getRow = function(rowIndex) {
if (rowIndex === 0) {
return [1];
}
let previousRow = getRow(rowIndex-1);
let currentRow = [];
for (let i = 0; i <= rowIndex; i++) {
if (i === 0 || i === rowIndex) {
currentRow.push(1);
} else {
currentRow.push(previousRow[i - 1] + previousRow[i]);
}
}
return currentRow;
};
发现一个很有趣的算法:
画了一下过程的确有效,跟之前的正向思维和逆向思维不一样的是,左右相加进行计算
// 方法三:
var getRow = function(rowIndex) {
let curRow = [1];
for (let r = 1; r <= rowIndex; r++) {
const shiftLeft = [...curRow, 0];
const shiftRight = [0, ...curRow];
curRow = shiftLeft.map((_, i) => shiftLeft[i] + shiftRight[i]);
}
return curRow;
};