leetcode 118 杨辉三角

题目描述

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:
输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

有两种方案解决

第一种

借助二维数组来实现, 一般实现最方便的就是二维数组, 下标为 0 和 对角线上元素 均为 1 ,其他元素都是自己肩上的元素之和, 比如示例 第三行 的 2 就是他肩上 两个元素 1 + 1 得来的。使用二维数组的主要几个公式如下:
    下面 arr 表示数组 i 表示 当前行 j 表示当前列

arr[i][j] = arr[i-1][j-1] + arr[i-1][j]
代码如下
package ArraysProblems;

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

class SolutionX118{
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<>();
        // 使用数组
        int [][] arr = new int[numRows][];
        // 开始初始化并创建杨辉三角
        for(int i = 0;i < numRows; i++){
            // 初始化内层数组 一维数组
            int []secondArr = new int[i+1];
            // 初始化 0 位 和 对角线位
            secondArr[0] = secondArr[i] = 1;
            // 内层数组传给 一维 初始化二维数组
            arr[i] = secondArr;
            // 开始初始化非 1 数值位
            if(i>=2){
                for(int j = 1; j < i; j++){
                    arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
                }
            }
        }
        for(int i = 0; i < numRows; i++){
            // 创建列表进行保存
            ArrayList arrayList = new ArrayList();

            for(int j = 0; j <=i ;j++){
                arrayList.add(arr[i][j]);
//                System.out.print(arr[i][j]+",");
            }
            list.add(arrayList);
        }
        // 下面是打印语句
//        Iterator it = list.iterator();
//        while (it.hasNext()){
//            System.out.println("结果:"+it.next());
//        }

        return list;

    }
}

public class JavaDemo2 {
    public static void main(String[] args) {
        SolutionX118 sx = new SolutionX118();
        sx.generate(5);
    }
}

资源耗费情况
时间内存
1ms34.8MB

时间上打败了97%多的人, 内存使用上打败了 24%的人。


下面来看看第二种方法

第二种

第二种方法其实和第一种方法,大同小异, 只是没有开辟二维数组罢了,使用的原理是一样的, 不过有意思的是, 和第一种方法相比,在时间和空间上并未有太大的改观。

代码如下
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

class SolutionY118{
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<>();
        if(numRows == 0)
            return list;
        // 开始初始化并创建杨辉三角
//        list.add((ArrayList)arr);
        for(int i = 0; i < numRows; i++){
            ArrayList arrayList = new ArrayList();
//            arr[0] = 1;
            arrayList.add(1);   // 初始化第一位 下标 0 位
            list.add(arrayList);    // 将整个数组添加进去 后面要用到
            if(i==1){              // 从 第3 行 开始进行加和 所以 第二行 即下标 1 的行 要保证有两个数 1
                arrayList.add(1);
            }
            if(i>=2){
                for(int j = 1; j < i; j++){
                    arrayList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
                }
                arrayList.add(1);
            }
        }
//        Iterator it = list.iterator();
//        while (it.hasNext()){
//            System.out.println("结果:"+it.next());
//        }
        return list;
    }
}

资源耗费情况
时间内存
1ms34.3MB

时间上打败了99.88%多的人, 内存使用上打败了 25.86%的人。
个人感觉没法再小了, 已经尽量没开辟空间,由于这是必须要返回的值,后来看了官方解答,差不多也是 有使用35.8MB左右内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值