LeetCode第118题—杨辉三角

本次写的题目是杨辉三角,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

🌱分析阶段

首先第一眼见到题目:

注意到返回的类型很古怪,不是我们常见的形式👇

 先研究这个 List<List<Integer>> ,我们都知道List的底层为数组,那么见到这种数组里面放入数组的,是不是可以画个图表示一下?

这就是 List<List<Integer>> 的图示相当于一个总数组,总数组里面的每一个位置上都装着一个子数组。

再看到图示,看看有没有什么受到启发的地方😎:

 好像.....

将左边的图旋转之后... 

 这样可不就是相当于杨辉三角上面的每一层都对应总数组上的一个位置,然后每一层都可以看作是一个子数组,装着当层杨辉三角的数据😎

这下便了然了 

 

 然后将杨辉三角的位置都移动一下,变成更加容易看的形式:

 我们都知道,杨辉三角是每一层头尾都为1,然后每层中除了头和尾以外的数据都是由每一层的都是由上一层的数据相加而成

📢总结:所以,现在我们需要完成三件事:①写出一个总数组    ②写出一个循环,每一次循环就能完成一层子数组并放入    ③子数组要怎么样填充好


🌱①写出一个总数组

按照要求,我们能够很快的写出一个数组,该数组能够接收的类型是List<Integer>类型,于是写出下列代码👇

List<List<Integer>> total = new ArrayList<>(numRows);

 而杨辉三角的第一层只有一个数据1,所以我们直接创造一个List放入1之后装进这个总数组内👇

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> total = new ArrayList<>(numRows);
        List<Integer> first = new ArrayList<>();
        first.add(1);
        total.add(first);
    }
}

 这样就成功把第一层放入了。


🌱②写循环并每次完成一层子数组

首先写一个循环,由于我们已经在总数组下标为0上的位置放入了杨辉三角的第一层,于是要从杨辉三角的第二层开始,也就是总数组的下标为1的位置上开始,而同时要满足每一层的头和尾要为1,所以写出下面的代码👇

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<Integer> first = new ArrayList<>();
        first.add(1);
        List<List<Integer>> total = new ArrayList<>(numRows);
        total.add(first);
        for(int i = 1; i < numRows; i++){   //从总List的下标1位置开始,一直循环到目标层数
            List<Integer> cur = new ArrayList<>();  //创建每一层的List
            cur.add(1); //增加头元素
            for(//这里先空着,过会儿用于填充每一层的中间元素){
                //这里先空着
            }
            cur.add(1); //增加尾元素
            total.add(cur); //把完成后的当层放入总数组List里面
        }
        return total;   //返回总数组
    }
}

🌱③完成每一层的中间元素

每一层的中间元素都需要获得上一层的对应位置的数据相加而得,而要获得上一层对应位置的数据,要使用List中的get函数

 首先需要得到总数组内的上一层子数组,然后再从子数组里面得到对应位置的数据相加,就需要用到两个get👉total.get(i-1).get(j-1)  与  total.get(i-1).get(j)

于是便得到了下面的代码👇

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<Integer> first = new ArrayList<>();
        first.add(1);
        List<List<Integer>> total = new ArrayList<>(numRows);
        total.add(first);
        for(int i = 1; i < numRows; i++){   //从总List的下标1位置开始,一直循环到目标层数
            List<Integer> cur = new ArrayList<>();  //创建每一层的List
            cur.add(1); //增加头元素
            for(int j = 1; j < i; j++){
                int str = total.get(i-1).get(j-1) + total.get(i-1).get(j);
                cur.add(str);
            }
            cur.add(1); //增加尾元素
            total.add(cur); //把完成后的当层放入总数组List里面
        }
        return total;   //返回总数组
    }
}

综上,所有代码都完成啦😆让我们来跑一遍试一下吧😎

 nice😎✨

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值