leetcode 118. Pascal's Triangle (ArrayList、List与思路难)

Given a non-negative integer numRows, generate the first numRows of Pascal’s triangle.

In Pascal’s triangle, each number is the sum of the two numbers directly above it.

Example:

Input: 5
Output:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

https://leetcode.com/problems/pascals-triangle/description/

题意:输出给定行数的帕斯卡三角形

bug:
1、想清楚固定的输出列表只有List,所以可以全局声明,列表data是每行都变的,所以每次局部声明
2、prev重复声明了两次,一次new一次list.get()
3、因为外层i和j对应了第几行第几个元素,对应位置要取=;但是list和ArrayList的索引值都是从0开始,对应位置时要-1

知识点:Arraylist和List
1、声明方式List<List<Integer>> list = new ArrayList<>();,new就是创建一个新的;
List<Integer> prev = list.get(i - 2);这种也是声明
2、return null返回空
3、list.add(1); 1是添加进去的数值(添加在数组的后面)
4、list.get(1); 1是要得到的索引值
5、ArrayList有顺序,索引从0开始,可以重复

class Solution {
    public List<List<Integer>> generate(int numRows) {

        if (numRows < 0) {
            return null;
        }

         List<List<Integer>> list = new ArrayList<>();//想象成二维数组

        if (numRows >= 1) {
            List<Integer> data = new ArrayList<>();//想象成一维数组
            data.add(1);
            list.add(data);//第一行
        }

        if (numRows >= 2) {
            List<Integer> data = new ArrayList<>();
            data.add(1);
            data.add(1);
            list.add(data);//第二行
        }

        if (numRows >=3) {
            for (int i = 3; i <=numRows; i++) {//此处设置i=3是为了方便行数对应,相当于前两行的位置是i=2和i=1
            //i代表第几行,j用来循环次数,因为data.add直接放置,不需要定位
                List<Integer> data = new ArrayList<>();
                List<Integer> prev = list.get(i - 2);//前一行
                data.add(1);//当前行的第一个元素
                for (int j = 2; j <= i -1; j++) {//当前行中间不为1的元素们
                    data.add(prev.get(j - 2) + prev.get(j - 1));//当前行的当前元素是前一行的两个元素之和
                }
                data.add(1);//当前行的最后一个元素

                list.add(data);//放置当前行
            }
        }

        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值