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

此题为自己解答,如有不对,请大神指点迷津

题目

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

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

示例:

输入: 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,然后排出第一行,剩下的按照特征添加元素。

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

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

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


        //新一行
        List newRow = null;

        //上一行
        List 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;
    }
}

说实话,这个算法不算是递归,应该还属于循环,由于还没有想出来递归到底怎么写才好,所以只能暂时这样写。

该算法在LeetCode中的结果

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


更新时间:2020年4月6日

杨辉三角第二版算法

与上一版本的区别在于这一版本用了递归的方法,上一版本用的是循环。

废话不多说,直接上最新源代码

public class Solution {

    /**
     * 第二版专用
     */
    private List> all = null;
    
    public List> generate(int numRows) {

        //判断输入的行数是否符合要求
        if (numRows < 1) {
            return new ArrayList<>(numRows);
        }

        //判断all中是否为空
        if (all == null) {
            all = new ArrayList<>(numRows);

        }

        //判断总List的长度是否达标
        if (all.size() >= numRows) {
            return all;
        }

        List each = null;

        List previous = null;

        if (all.size() < 1) {
            each = new ArrayList<>(1);

            all.add(each);

            all.get(0).add(1);
        } else {
            int length = all.size();

            previous = all.get(length - 1);

            each = new ArrayList<>(length);

            each.add(1);

            for (int a = 1; a < previous.size(); a++) {
                each.add(previous.get(a - 1) + previous.get(a));
            }

            each.add(1);


            all.add(each);
        }

        all = generate(numRows);

        return all;
    }
}

该算法在LeetCode中的结果

用时:0ms
内存消耗:37.7MB

你可能感兴趣的:(leetcode,算法,算法复杂度)