LeetCode_09:Pascal's Triangle II

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;
	};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值