Given an index k, return the kth row of the Pascal's triangle.

For example, given k = 3,
Return [1,3,3,1].

Note:
Could you optimize your algorithm to use only O(k) extra space?

这道题倒是不难,有个有意思的地方是可以优化到O(k)的空间复杂度。下面先上O(k^2)的算法。

    @Test
public List<Integer> getRow(int rowIndex) {
int[][] f = new int[rowIndex + 1][rowIndex + 1];
List<Integer> res = new ArrayList<>();
for (int i = 0; i <= rowIndex; i++) {
res.add(getNum(rowIndex, i, f));
}
return res;
} public int getNum(int row, int col, int[][] f) {
if (row == 0 || row == 1 || col == 0 || col == row)
return 1;
if (col < 0)
return 0;
if (f[row][col] == 0)
f[row][col] = getNum(row - 1, col, f) + getNum(row - 1, col - 1, f);
return f[row][col];
}

上面算法还算比较直观,就是依次取出第rowIndex行的各个元素,加入到list中。通过代码可以发现,第K行的数据仅仅依赖于第K-1行,也就是说,我们可以进行降维,将二维数组降为一维,这里注意,降维之后,用一维数组来记录当前行的数据,计算的时候应从后往前计算,还是以二维进行假设,当前元素为

  F[k][col]=F[k-1][col]+F[k-1][col-1]

那么,当循环走完k-1遍时,一维数组里的数据F[col]里存的是对应二维数组的F[k-1][col],从后往前计算,F[col]=F[col]+F[col-1],那么走完这一遍,F数组里存的是F[k][0...col]的数据,如果从前往后计算,F[col]=F[col]+F[col-1],仔细看,F[col+1]=F[col+1]+F[col],这里就有问题了,F[col]这里已经不是k-1状态的数据了,所以这样计算有问题。这个降维的技巧在动态规划里也经常用,注意要从后往前计算。

Talk is cheap。

  public ArrayList<Integer> getRow(int rowIndex) {
ArrayList<Integer> res = new ArrayList<>();
if (rowIndex < 0)
return res;
res.add(1);
for (int i = 1; i <= rowIndex; i++) {
for (int j = res.size() - 2; j >= 0; j--) {
res.set(j + 1, res.get(j) + res.get(j + 1));
}
res.add(1);
}
return res;
}

Pascal's Triangle II —LeetCode的更多相关文章

  1. Pascal's Triangle II leetcode

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  2. Pascal's Triangle II Leetcode java

    题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return ...

  3. 学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4

    当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用.这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这 ...

  4. leetcode 118. Pascal's Triangle 、119. Pascal's Triangle II 、120. Triangle

    118. Pascal's Triangle 第一种解法:比较麻烦 https://leetcode.com/problems/pascals-triangle/discuss/166279/cpp- ...

  5. 【LeetCode】Pascal's Triangle II 解题报告

    [LeetCode]Pascal's Triangle II 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/pascals-tr ...

  6. 【LeetCode】118 & 119 - Pascal's Triangle & Pascal's Triangle II

    118 - Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, ...

  7. LeetCode OJ 119. Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  8. LeetCode: Pascal's Triangle II 解题报告

    Pascal's Triangle II Total Accepted: 19384 Total Submissions: 63446 My Submissions Question Solution ...

  9. LeetCode Pascal's Triangle && Pascal's Triangle II Python

    Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given ...

随机推荐

  1. Maven常用插件--转

    =========Maven Report Plugin========= 1.源码分析 <artifactId>maven-pmd-plugin</artifactId> 2 ...

  2. C++初始化顺序

    1. 全局和类的静态变量成员在main之前构造和初始化,静态成员不能在类的内部构造初始化 2. 类的普通成员依据在类内的定义顺序初始化,类的构造函数的初始化类表只能决定成员的构造函数,不能决定构造顺序 ...

  3. Android(java)学习笔记215:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

  4. CSS代码语法

    css 样式由选择符和声明组成,而声明又由属性和值组成,如下图所示: 选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素(如ol)不会受到 ...

  5. 手把手教你DIY一个春运迁徙图(一)

    换了新工作,也确定了我未来数据可视化的发展方向.新年第一篇博客,又逢春运,这篇技术文章就来交给大家如何做一个酷炫的迁徙图(支持移动哦).(求star 代码点这里) 迁徙图的制作思路分为静态的元素和变换 ...

  6. [转]mysql 的日志的启动与查看

    mysql有以下几种日志:错误日志:  -log-err查询日志:  -log慢查询日志: -log-slow-queries更新日志:    -log-update二进制日志:-log-bin 日志 ...

  7. cxf客户端代码wsdlLocation设置相对路径

    利用工生成的cxf客户端代码,wsdlLocation都是绝对路径,为了便于项目更加灵活管理,我们可以将该路径设置为相对路径: 1.下面图片是我的项目路径图片及wsdl地址存放路径: 2.下面图片是我 ...

  8. memset 初始化数组

    memset是初始化一段内存区域的函数,其头文件是<string.h>,以前经常使用出现错误,整理一下. C++ Reference对于memset的定义为: void * memset ...

  9. 小波 mallat 算法

    算法要求:输入序列是大于滤波器长度的偶数列 确实可以通过编程的手段使算法适合所有的情况,但本文章的目的是展示mallat算法的过程,所以就一切从简了 // Mallat.cpp : Defines t ...

  10. 30 个 php 操作 redis 常用方法代码例子

    这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类型. list 类型和 set 类型的数据 , 需要的朋友可以参 ...