算法--帕斯卡三角(杨辉三角)JS写法

题目:
Given a non-negative integer numRows, generate the first numRows of Pascal’s triangle.
picture
In Pascal’s triangle, each number is the sum of the two numbers directly above it.
Example:
Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

博主写的初步解法:
已知根据上一层的数据可以求出下一层的数据
这里设arr1为上一层的数组,arr2为下一层的数组

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function(numRows) {
    let arr = [];
    let arr1 = [], arr2 = [1];
    for (let i = 1; i <= numRows; i++) {
    	// 替换上一层的数组
        arr1 = [].concat(arr2);
        arr.push(arr1);
        for(let j = i; j > 0; j--) {
        	// 每层数组的开始和结尾数据都为1
            arr2[0] = 1;
            arr2[i] = 1;
            if (j > 0 && j < i) {
            	// 除开始和结尾数据以外的其他数据都等于上一层的两个数据的和
                arr2[j] = arr1[j - 1] + arr1[j];
            }
        }
    }
    return arr;
};

上面那种解法在时间上是没有问题的,但是运用了两个数组,占用了更多内存。实际上arr1是没有必要的,可以直接在arr2上进行修改,因为往下的每一层数据都在递增,所以不存在数组中数据丢失的问题。
这里我们把arr1和arr2换成一个数组arr1,解法如下:

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function(numRows) {
    let arr = [];
    let arr1 = [1];
    for (let i = 0; i < numRows; i++) {
        for(let j = i; j > 0; j--) {
            if (j === i) {
            	// 每行末尾值等于上一行的末尾值
                arr1[j] = arr1[j - 1]
            } else if (j === 0) {
            	// 每行的开始值等于1
                arr1[j] = arr1[0]
            } else {
                arr1[j] = arr1[j - 1] + arr1[j];
            }
        }
        arr.push([].concat(arr1));
    }
    return arr;
};
发布了18 篇原创文章 · 获赞 0 · 访问量 2532

猜你喜欢

转载自blog.csdn.net/weixin_36465540/article/details/89490910