【LeetCode】力扣递归题-杨辉三角1

此题为本身解答,若有不对,请大神指点迷津

题目

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

示例:算法

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]
来源:力扣(LeetCode)
连接: https://leetcode-cn.com/problems/pascals-triangle
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。

解题思想

根据杨辉三角形特征:数组

  1. 每一行第一个元素和最后一个元素均为1
  2. 每一行的元素个数与当前行数相等
  3. 中间元素均为当前元素的左上方和右上方元素之和

由此咱们能够推算出,只要知道上面一行的全部元素,就能求出当前行的元素网络

算法

在这一题很简单,固然是对于数组和循环来讲。用递归就稍微难了一些。
首先,先设置一个保存全部行的List,而后排出第一行,剩下的按照特征添加元素。spa

/**
 * @ClassName Solution
 * @Description 杨辉三角
 * @Author XXX
 * @Date 2020/3/31 20:08
 * @Version 1.0
 **/
public class Solution {
    public List<List<Integer>> generate(int numRows) {
        //杨辉三角总和
        List<List<Integer>> all = new ArrayList<>(numRows);

        //判断numRows是否是为小于1的数
        if(numRows <= 0) {
            return all;
        }

        //第一行老是为1
        all.add(new ArrayList<>());
        all.get(0).add(1);


        //新一行
        List<Integer> newRow = null;

        //上一行
        List<Integer> previous = null;

        for (int i = 1; i < numRows; i++) {
            newRow = new ArrayList<>();

            if (i == 1) {
                //每个行第一个元素老是1
                newRow.add(1);

                //每一行最后一个元素老是1
                newRow.add(1);
            } else {
                previous = all.get(i-1);
                //每个行第一个元素老是1
                newRow.add(1);

                //添加中间元素
                for (int b = 1; b < i; b++) {
                    newRow.add(previous.get(b-1) + previous.get(b));
                }

                //每一行最后一个元素老是1
                newRow.add(1);


            }

            //将新一行的数据添加到list
            all.add(newRow);
        }

        return all;
    }
}

说实话,这个算法不算是递归,应该还属于循环,因为尚未想出来递归到底怎么写才好,因此只能暂时这样写。code

该算法在LeetCode中的结果

用时:1ms
内存消耗:37.6MBblog

相关文章
相关标签/搜索