LeetCode——118. 杨辉三角

题目描述

题干:
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。

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

题解思路

先说说杨辉三角形,欧洲也叫帕斯卡三角形,比杨辉落后600多年才总结出来的模型,与数学二项式和组合联系紧密

就这个伟大的算法题,题干告诉了我们规律,简单的做法就是按照这个规律来构建二维数组来完成

但是看他的输出你会发现结果并不是二维数组构成的,而且方法类型也表明了用List数组嵌套,还有Integer的泛型约束

其实思路还是不变的,就是用到List.add方法来代替数组即可,但是这只是普通方法,在评论区有着一种新方法

他发现发现当前一行只比上一行多了一个元素,最最关键的一点:本行元素等于上一行元素往后错一位再逐个相加

https://leetcode-cn.com/problems/pascals-triangle/solution/qu-qiao-jie-fa-cuo-yi-wei-zai-zhu-ge-xiang-jia-28m/


正确代码

class Solution {
    public List<List<Integer>> generate(int numRows) {
        //先声明最外层List
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        for (int i = 0; i < numRows; ++i) {
            //声明内层List,最后没循环一次,外层就添加新一层的List
            List<Integer> row = new ArrayList<Integer>();
            for (int i1 = 0; i1 <= i; ++i1) {
                //每一行最后一个和第一个都是1
                if (i1 == 0 || i1 == i)
                    row.add(1);
                else
                    //根据规律,每个数字等于上一行的左右两个数字之和
                    row.add(ans.get(i - 1).get(i1 - 1) + ans.get(i - 1).get(i1));
            }
            //加入到外层List中
            ans.add(row);
        }
        return ans;
    }
}

总结

其实本题还是依照了传统做法,如果你也能像参考的方法那样想到新的解题思路,那就是再好不过了

文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见
posted @ 2021-03-08 13:04  21岁还不是架构师  阅读(71)  评论(0编辑  收藏  举报