LeetCode118. Pascal's Triangle

118.Pascal’s Triangle
image

帕斯卡尔三角形也就是杨辉三角形
发现规律:
* 每一行中数的个数与行号相等;
* 每一行中除了第一个和最后一个元素,其他元素是上一行中相邻两个元素之和;

由这两个规律可以得到杨辉三角形。
方法一: 这里 i 代表层数,从 1 开始,List中先插入非 1 元素,最后插入首尾两个1。

public List<List<Integer>> generate(int numRows) {
    List<List<Integer>> result = new ArrayList<>();
    if(numRows == 0) return result;
    List<Integer> row1 = new ArrayList<>();
    row1.add(1);
    result.add(row1);
    for(int i = 2; i <= numRows; i++){
        List<Integer> row = new ArrayList<>();
        for(int j = 0; j < i - 2; j++){
        /*这里减2个1,是因为层号是从1开始的,而List中是从0开始的,
        所以要得到上一行的数据,要减2个1*/
            List<Integer> preRow = result.get(i - 1 - 1);                                                    
            row.add(preRow.get(j) + preRow.get(j + 1));
        }
        row.add(1);
        row.add(0, 1);
        result.add(row);
    }
    return result;
}

方法二:
规律:每一行可以由上一行变形得到,先在上一行最前面插入1,然后从第二位开始,将每一位重置为该位与后面相邻一位之和,直到倒数第二位。
这里的row是存储型的,每次变换 row ,每次在最前面插入1,然后第二位到倒数第二位重置为相邻两数之和.得到新的一行。

public List<List<Integer>> generate2(int numRows)
{
    List<List<Integer>> allrows = new ArrayList<List<Integer>>();
    ArrayList<Integer> row = new ArrayList<Integer>();
    for(int i=0;i<numRows;i++)
    {
        row.add(0, 1);
        for(int j=1;j<row.size()-1;j++)
            row.set(j, row.get(j)+row.get(j+1));
        allrows.add(new ArrayList<Integer>(row));
    }
    return allrows;     
}

方法三: 跟方法一相比,这里元素插入list是按顺序的,而方法一中是先插入非1元素,最后插入首尾两个1.

public List<List<Integer>> generate3(int numRows) {
    List<List<Integer>> triangle = new ArrayList<List<Integer>>();
    if (numRows <=0){
        return triangle;
    }
    for (int i=0; i<numRows; i++){
        List<Integer> row =  new ArrayList<Integer>();
        for (int j=0; j<i+1; j++){
            if (j==0 || j==i){
                row.add(1);
            } 
            else {
                row.add(triangle.get(i-1).get(j-1)+triangle.get(i-1).get(j));
            }
        }
        triangle.add(row);
    }
    return triangle;
}

方法四: 这里跟方法三不一样的地方是,使用一个list记录上一行的值.

public List<List<Integer>> generate4(int numRows) {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    List<Integer> row, pre = null;
    for (int i = 0; i < numRows; ++i) {
        row = new ArrayList<Integer>();
        for (int j = 0; j <= i; ++j){
            if (j == 0 || j == i)
                row.add(1);
            else
                row.add(pre.get(j - 1) + pre.get(j));
        }
        pre = row;
        res.add(row);
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值