Problem 118

Pascal's Triangle

Posted by Ruizhi Ma on June 25, 2019

问题描述

其实就是杨辉三角,题目看网址:https://leetcode.com/problems/pascals-triangle/

解决思路

主要有几个地方需要处理:

  1. 通过遍历上一行元素,将当前元素由其左上角和右上角元素之和获得
  2. 每行最后一个元素1,要单独加入
  3. 要使用双层List(List<List<>>),内层List是每一行所有元素的集合,外层List是内层所有List组成的集合。
    其他更仔细地,代码注释写的很详细了。

问题解惑

  1. 第一次的it.hasNext(),是第0个元素。一开始以为是第0个元素的下一个元素,这样是错的。
  2. 同样的,每次循环的第一个it.next(),也是第0个元素。firstAdd = 0,secondAdd = it.next() = 1, firstAdd + secondAdd = 0 + 1 = 1,这就是每行第0个元素哪里来的原因。

代码

package leetcode;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class PascalsTriangle {
    public List<List<Integer>> generate(int numRows) {
        List<Integer> TriangleRows = new ArrayList<>();//三角形的行数
        List<List<Integer>> PascalTriangle = new ArrayList<>();//用于保存输出三角

        //特殊情况判定
        if (numRows == 0) return PascalTriangle;

        //第一行加入初始值1
        TriangleRows.add(1);
        //将初始值加入三角
        PascalTriangle.add(TriangleRows);

        //只有一行的,单独处理
        if (numRows == 1) return PascalTriangle;

        //从第二行开始遍历三角形行数
        for (int i = 2; i <= numRows; i++){
            //迭代器,用于遍历上一行的元素
            Iterator<Integer> it = TriangleRows.iterator();

            //用于存放第一个加数
            int firstAdd = 0;

            //用于存放两个加数的和
            List<Integer> sum = new ArrayList<>();

            while(it.hasNext()){
                //第二个加数,整个过程讲遍历整行元素
                int secondAdd = it.next();

                //将和加入sum
                sum.add(firstAdd+secondAdd);

                //将第二个加数赋给第一个加数,使第一个加数后移
                firstAdd = secondAdd;
            }

            sum.add(1);//将每行最后一个数设为1,单独处理
            PascalTriangle.add(sum);//将处理完毕的sum加入最终三角
            TriangleRows = sum;//将sum赋值给Triangle,sum下移

        }
        return PascalTriangle;
    }
}

小感想

**注意: **