【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

相關文章
相關標籤/搜索