算法习题 - 杨辉三角

74 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


问题

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在这里插入图片描述

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5 输出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa…


分析

  1. 首先,第一行和第二行,可以直接返回结果,规律从第3行开始

  2. 如果i=3,那么第[0]个元素肯定是1,第[i-1]个元素也肯定是1,其中,第[1]个元素便是上一行的第[0]个3. 元素和第[1]个元素的和。

  3. 如果i=4,那么第[0]个元素肯定是1,第[i-1]个元素也肯定是1,

    • 当要获取j=1时,第[j]个元素是上一行第[j-1]个元素和第[j]个元素的和
    • 当要获取j=2时,第[j]个元素是上一行第[j-1]个元素和第[j]个元素的和

综上,可以对for(j=1;j<i-1;j++)进行循环获取值的处理。


解法

class Solution
{

    /**
     * @param Integer $numRows
     * @return Integer[][]
     */
    function generate($numRows)
    {
        if ($numRows === 0) {
            return [];
        }
        $triangleArr[0] = ['1']; //第一行
        if ($numRows === 1) {
            return $triangleArr;
        }

        $triangleArr[1] = ['1', '1']; //第二行
        if ($numRows === 2) {
            return $triangleArr;
        }

        for ($i = 2; $i < $numRows; $i++) {
            $triangleArr[$i][0] = 1;
            for ($j = 1; $j < $i; $j++) {
                $triangleArr[$i][$j] = $triangleArr[$i - 1][$j - 1] + $triangleArr[$i - 1][$j];
            }
            $triangleArr[$i][$i] = 1;
        }
        return $triangleArr;
    }
}

结果

在这里插入图片描述