力扣-118. 杨辉三角

238 阅读1分钟

1. 题目描述

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

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

示例 1:

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

提示:

  • 1 <= numRows <= 30

Tips: 力扣:leetcode-cn.com/problems/pa…

2.思路分析

杨辉三角中有这样一个特性:每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和。三角形同样也可以当做一个二维数组。

  1. 将杨辉三角进行一个变化

image.png

  1. 用n[row] [col] 二维数组描述杨辉三角,这样描述一部分

  2. n[3] [2] = n[2] [1] + n[2] [2],观察图可以知道n[row] [col] = n[row-1] [col-1] + n[row-1] [col],如果col<0 或者 row > 0 那么对应的位置值看成0。把左侧和右侧的值也弄成杨辉三角的特性。

3. AC代码

class Solution {
    public List<List<Integer>> generate(int numRows) {
        int[][] dp = new int[numRows+1][numRows+1];
        for(int i = 1; i <= numRows;++i){
            dp[i][1] = 1;
        }
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> item = new ArrayList<>();
        item.add(1);
        result.add(item);
        for(int i = 2; i <= numRows; ++i){
            item = new ArrayList<>();
            for(int j = 1; j <= i; ++j){
                dp[i][j] = dp[i-1][j-1]+dp[i-1][j];
                item.add(dp[i-1][j-1]+dp[i-1][j]);
            }
            result.add(item);
        }
        return  result;
    }
}

4. 总结

通过观察动态图了解杨辉三角的特性,然后根据特性进行规律的查找。把规律通过代码进行表达得到最终的运行结果。这个需要注意一个地方就是最左侧和最右侧的数字。通过增加一个二维数组的行和列将杨辉三角的特性进行统一。这样可以避免特殊处理最左侧和最右侧的数据。

我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢