LC-杨辉三角-记忆版

LC-杨辉三角-记忆版

上一篇:LC-杨辉三角

上一篇讲了杨辉三角的算法,不过之前的算法存在一个问题,比如:

a[5][3] = a[4][2] + a[4][3]
a[5][4] = a[4][3] + a[4][4]

我们可以看到计算a[5][3]和a[5][4]时都需要a[4][3]的值,之前我们是需要每次用到都重新计算,这样就比较耗时,有没有办法记住已经算过的值呢,当下次用的时候直接获取就不用重新计算了,以空间来换取时间。
我们可以新增一个二维数组,把计算的结果放到数组中,每次计算前先查看一下数组中是否存在,如果已存在就获取值,不存在再计算。
下面是修改后的代码:

    public List<List<Integer>> generate(int numRors){
        int[][] catchs = new int[numRors][numRors];
        List<List<Integer>> a = new ArrayList<List<Integer>>();
        for (int k = 0; k < numRors; k++) {
            List temp= new ArrayList();
            for (int l = 0; l <= k; l++) {
                System.out.print(f(catchs,k, l)+" ");
                temp.add(f(catchs,k, l));
            }
            a.add(temp);
            System.out.println();
        }
        return a;
    }


    private int f(int[][] catchs,int i, int j) {//0 1
        if (j == 0 || i == j) {
            return 1;
        }
        if(catchs[i][j] != 0){
            return catchs[i][j];
        }
        int i1 = f(catchs, i - 1, j - 1) + f(catchs, i - 1, j);
        catchs[i][j] = i1;
        return i1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值