杨辉三角|Java 刷题打卡

本文正在参加「Java主题月 – Java 刷题打卡」,详情查看 活动链接

题目描述

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

119.给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

PascalTriangleAnimated2.gif

思路分析

首先,我们先将杨辉三角特殊处理一下,如下图:

Snipaste_2021-05-28_23-10-28.png
进行如图所示的处理后,将每一行的元素看成是数组的元素,并可以得出以下结论:

  1. 第k行的0和k-1位置上的元素始终是1;
  2. 第k行的i位置(0<i<k-1)上的元素为第k-1行i-1与i位置上的元素之和。

根据以上结论便得出如下118题的代码。

而119题这是要展示第k+1行的数据,因此只需要做出简单的小调整:

  1. k值从0开始
  2. 只需要返回第k+1行的数据

由以上得出如下119题第一份代码。

此方案是可以优化的,每次计算出一行数据,都需要用一个数组来保存,才能根据这一行的数据来计算下一行,我们可以考虑在同一个数组中进行原位操作,从而将空间复杂度变为O(1)。
而这里如果从前向后计算,会因为值被替换而导致结果错误,例如根据第4行计算第5行的2位置的值时,由于1位置的值4已经计算出来并替换了第4行的1位置的3,所以会导致计算结果错误,因此这里考虑从后向前开始计算。

优化后的代码如下119题第二份代码。

代码展示

// 118题
public List<List<Integer>> generate(int numRows) {
    List<List<Integer>> ret = new ArrayList<>();
    // 特殊值处理
    if (numRows == 0)
        return ret;
    Integer[] nums = null;
    for (int k = 1; k <= numRows; k++) {
        // 记录k-1行的内容
        Integer[] lastNums = nums;
        // 初始化k行数组
        nums = new Integer[k];
        for (int j = 0; j < k; j++) {
            if (j == 0 || j == k - 1) {
                nums[j] = 1;
            } else {
                nums[j] = lastNums[j - 1] + lastNums[j];
            }
        }
        ret.add(new ArrayList<>(Arrays.asList(nums)));
    }
    return ret;
}
复制代码
// 119题
public List<Integer> getRow(int rowIndex) {
    Integer[] nums = null;
    for (int k = 0; k <= rowIndex; k++) {
        // 记录k-1行的内容
        Integer[] lastNums = nums;
        // 初始化k行数组
        nums = new Integer[k + 1];
        for (int j = 0; j < k + 1; j++) {
            if (j == 0 || j == k) {
                nums[j] = 1;
            } else {
                nums[j] = lastNums[j - 1] + lastNums[j];
            }
        }
    }
    return Arrays.asList(nums);
}

// 优化
public List<Integer> getRow1(int rowIndex) {
    Integer[] nums = new Integer[rowIndex + 1];
    for (int k = 0; k <= rowIndex; k++) {
        for (int j = k; j >= 0; j--) {
            if (j == 0 || j == k) {
                nums[j] = 1;
            } else {
                nums[j] = nums[j - 1] + nums[j];
            }
        }
    }
    return Arrays.asList(nums);
}
复制代码

总结

转换思维,理清思路,持续学习,不断优化^_^

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享