118.杨辉三角的实现

题目:

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在这里插入图片描述
在这里插入图片描述

思路:

杨辉三角的特点:
1.第一行,是一个1
2.第二行是两个1;
3.第i行有i个元素,并且首尾两个元素都是1
4.第i行第j列的元素等于 第 i-1 行第j-1列 + 第i-1行第j列.
最后返回的result是一个类似二维数组的List,所以分为各行来处理问题.
尤其注意处理第i行情况时,循环次数以及下标和行列数转换的问题.

代码:

时间复杂度:O(numRow^2)

package container;

import java.util.ArrayList;
import java.util.List;
    //给定一个非负整数 numRows,生成杨辉三角的前numRows行
//杨辉三角的特点
// 1.第一行,是一个1
// 2.第二行是两个1;
//3.第i行有i个元素,并且首尾两个元素都是1
//4.第i行第j列的元素等于 第 i-1 行第j-1列 + 第i-1行第j列

public class YangHuiTriangle {
    public List<List<Integer>> generate(int numRows) {
     List<List<Integer>> result = new ArrayList<>();
     //先对numRows进行合法校验
        if (numRows <= 0){
            //返回size为0的List;
            return result;
        }
        //1.第一行元素是一个1
        List<Integer> firstline = new ArrayList<>();
        firstline.add(1);
        //将第一行加入到整个结果中去,最后结果类似于一个长度不固定的二维数组
        result.add(firstline);
        if (numRows == 1){
            return result;
        }
        //2.第二行元素是两个1;
        List<Integer> secondline = new ArrayList<>();
        secondline.add(1);
        secondline.add(1);
        result.add(secondline);
        if (numRows == 2){
            return result;
        }
        //3.处理第i行元素,
        //要先找到第i行的前一行
        for (int i = 3;i <= numRows;i++) {
            //要想知道第i行的元素值,就得知道第i-1行的元素值
            //因为数组下标都是从0开始的,而第几行第几行是从1开始的
            // 所以i-1求的是第i-1行,i-1-1才能得到第i-1行的下标
         List<Integer> preline = result.get((i-1)-1);
         List<Integer> curline = new ArrayList<>();
         curline.add(1);
         //处理第j列的情况,
        // 因为第i行有i个元素,又因为首末都是1,所以循环次数是i-2次;
         for (int j = 2;j < i;j++){
          //第i行第j列的元素就等于第i-1行第j-1列 + 第i-1行第j列
         //因为第几列第几列都是从1开始,而存在List里面的元素下标都是从0开始,所以要j-1-1;
             int curNum = preline.get(j-1-1) + preline.get(j-1);
             curline.add(curNum);
         }
         //加上最后一个1
         curline.add(1);
         //内部循环结束后 第curline行就整理完毕了
            result.add(curline);
        }
        //外部循环结束后,意味着所有行都整理完毕了
     return result;
    }

    public static void main(String[] args){
        int numRows = 5;
        YangHuiTriangle list = new YangHuiTriangle();
       System.out.println(list.generate(numRows));
    }

}

暂不用考虑输出形式问题
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值