这是悦乐书的第171次更新,第173篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第30题(顺位题号是119)。给定非负索引k,其中k≤33,返回Pascal三角形的第k个索引行。行索引从0开始。在Pascal的三角形中,每个数字是它上面两个数字的总和。例如:

输入: 2

输出: [1,2,1]

输入: 3

输出: [1,3,3,1]

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

昨天的那道题,是要求输出所有层的数据,今天这题只要求具体某一行的数据,那是不是完全可以借用昨天的代码,最后返回具体某一层即可?这种解法当然是可行的,但是题目有个提示,要求空间复杂度是O(k),其中k代表某一行。而昨天的解法,最后的空间复杂度是O(numRows^2),那能不能把空间复杂度再缩小点?答案是可以的。

我们可以先将list中的每个元素初始值设为1,然后开始循环处理。外层循环控制层数,进入内层循环,改变具体位置元素的值。我们知道第k层第j(j>=1)个元素的值是第k-1层第j-1个元素和第j个元素之和,如果按照从左至右的顺序,后面元素的值需要借助前面元素的值的时候,是已经被改变过的值,最后的结果会失真,所以我们采用从右至左的顺序设值。

注意:list.set(j, value)此方法是找到索引j所在元素,将value设值给它,不会新增元素,而add(value)是会新增元素的。

  1. public List<Integer> getRow(int rowIndex) {
  2. List<Integer> list = new ArrayList<Integer>();
  3. for (int k = 0; k <= rowIndex; k++) {
  4. list.add(1);
  5. }
  6. for (int i = 1; i < rowIndex; i++) {
  7. for (int j = i; j > 0; j--) {
  8. list.set(j, list.get(j - 1) + list.get(j));
  9. }
  10. }
  11. return list;
  12. }

03 第二种解法

同样是第一种解法的思路,但是我想从左至右设值怎么办?

既然想要从左至右设值,那就需要左边的数据是新的,而不是已经被计算过的新值,就需要把每次计算过的值往后移动一位,此时我们就无法在开始时就将list的初始元素值设为1,二是要在循环中添加新的元素,从而把旧的元素往后挪一位。

外层循环一方面是控制层数,另外一个方面就是每次在list的索引0位置新增元素1。只有当r等于2时,才会进入内层循环,此时list中至少有三个元素。

因为首尾元素都是1,所以内层循环的索引起始位置是1(第二位),依次往右重新设值。

  1. public List<Integer> getRow2(int rowIndex) {
  2. List<Integer> list = new ArrayList<>();
  3. for (int r = 0; r <= rowIndex; r++) {
  4. list.add(0, 1);
  5. for (int i = 1; i < r; i++) {
  6. list.set(i, list.get(i) + list.get(i + 1));
  7. }
  8. }
  9. return list;
  10. }

04 第三种解法

我们还可以使用数组来操作此题,思路与昨天的那道题大致类似。

外层循环每次创建一个新的数组,数组长度是i+1,并且此数组的首尾元素是为1,然后开始内层循环,新数组的第j(j>=1)位元素是上一数组中的第j-1位和第j位元素之和。在结束内层循环后,还要将旧数组指向经过内层循环赋值完后的新数组。最后,将数组里面的元素遍历赋值给list。

  1. public List<Integer> getRow3(int rowIndex) {
  2. List<Integer> list = new ArrayList<Integer>();
  3. int[] result = new int[1];
  4. for (int i = 0; i <= rowIndex; i++) {
  5. int[] next = new int[i + 1];
  6. next[0] = 1;
  7. next[i] = 1;
  8. for (int j = 1; j < i; j++) {
  9. next[j] = result[j - 1] + result[j];
  10. }
  11. result = next;
  12. }
  13. for (int in : result) {
  14. list.add(in);
  15. }
  16. return list;
  17. }

05 验证与测试

针对上面三种解法,选取部分随机数字并测试不同解法耗时,代码如下:

  1. public static void main(String[] args) {
  2. Easy_119_PascalTriangleII instance = new Easy_119_PascalTriangleII();
  3. int rowIndex = 3;
  4. long start = System.nanoTime();
  5. List<Integer> list = instance.getRow(rowIndex);
  6. long end = System.nanoTime();
  7. System.out.println("getRow---输入:"+rowIndex+" , 输出:"+list+" , 用时:"+(end-start)/1000+"微秒");
  8. long start2 = System.nanoTime();
  9. List<Integer> list2 = instance.getRow2(rowIndex);
  10. long end2 = System.nanoTime();
  11. System.out.println("getRow2---输入:"+rowIndex+" , 输出:"+list2+" , 用时:"+(end2-start2)/1000+"微秒");
  12. long start3 = System.nanoTime();
  13. List<Integer> list3 = instance.getRow3(rowIndex);
  14. long end3 = System.nanoTime();
  15. System.out.println("getRow3---输入:"+rowIndex+" , 输出:"+list3+" , 用时:"+(end3-start3)/1000+"微秒");
  16. }

测试结果如下:

  1. getRow---输入:10 , 输出:[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1] , 用时:73微秒
  2. getRow2---输入:10 , 输出:[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1] , 用时:48微秒
  3. getRow3---输入:10 , 输出:[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1] , 用时:24微秒

06 小结

解法一和解法二的思路类似,但是第二种解法稍快于解法一,第三种解法耗时最少,但是三种解法的空间复杂度都是O(k)。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Pascal's Triangle II(Java实现)的更多相关文章

  1. LeetCode算法题-Pascal's Triangle(Java实现)

    这是悦乐书的第170次更新,第172篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第29题(顺位题号是118).给定非负整数numRows,生成Pascal三角形的第一个 ...

  2. 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, ...

  3. 【一天一道LeetCode】#119. Pascal's Triangle II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  4. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  5. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  6. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  7. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  8. LeetCode算法题-Shortest Completing Word(Java实现)

    这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...

  9. LeetCode算法题-Self Dividing Numbers(Java实现)

    这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...

随机推荐

  1. golang包管理解决之道——go modules初探

    golang的包管理是一直是为人诟病之处,从golang1.5引入的vendor机制,到准官方工具dep,目前为止还没一个简便的解决方案. 不过现在go modules随着golang1.11的发布而 ...

  2. Python之使用Pandas库实现MySQL数据库的读写

      本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写.首先我们需要了解点ORM方面的知识. ORM技术   对象关系映射技术,即ORM(Object-Relational ...

  3. Python爬虫之多线程下载豆瓣Top250电影图片

    爬虫项目介绍   本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:   本次爬虫项目将分别不使用多线程和使 ...

  4. [转]Node.JS使用Sequelize操作MySQL

    Sequelize官方文档  https://sequelize.readthedocs.io/en/latest/ 本文转自:https://www.jianshu.com/p/797e10fe23 ...

  5. .Net 登陆的时候添加验证码

    一.ASPX 登陆界面验证码 1.登陆验证码图片和输入验证码框 <asp:TextBox ID="txtValiCode" runat="server" ...

  6. Linq中的Select与Select many

    Select与Select Many 之前在项目中查询数据库中的数据,都是通过sql语句来查询的,但是随着时代的发展,微软在.Net Framework 4.5版中推出的一个主要的特性——LINQ. ...

  7. 点到圆弧的距离(csu1503)+几何

    1503: 点到圆弧的距离 Time Limit: 1 Sec  Memory Limit: 128 MB  Special JudgeSubmit: 325  Solved: 70[Submit][ ...

  8. Java 原生网络编程.

    一.概念 Java 语言从其诞生开始,就和网络紧密联系在一起.在 1995 年的 Sun World 大会上,当时占浏览器市场份额绝对领先的网景公司宣布在浏览器中支持Java,从而引起一系列的公司产品 ...

  9. Mybatis框架可视化(1)

    Mybatis整体架构视图: 接 口 层 SqlSession (定义了Mybatis暴露给应用程序调用的API) 核 心 处 理 层 配置解析 (加载核心配置.映射配置. mapper接口注解信息, ...

  10. C#设计模式之十六观察者模式(Observer Pattern)【行为型】

    一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲“行为 ...