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

LeetCode: Pascal's Triangle II (返回杨辉三角形第i行) 杨辉三角形大家应该不陌生,其第i行恰好为 (a + b)i 的展开系数。比如上一道题的例子: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 这道题要求直接返回第i行。题目描述为: Given an index k, return the kth row of the Pascal's triang 阅读详情

这是悦乐书的第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)是会新增元素的。

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

03 第二种解法

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

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

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

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

public List<Integer> getRow2(int rowIndex) {
    List<Integer> list = new ArrayList<>();
    for (int r = 0; r <= rowIndex; r++) {
        list.add(0, 1);
        for (int i = 1; i < r; i++) { 
            list.set(i, list.get(i) + list.get(i + 1)); 
        }
    }
    return list;
}

04 第三种解法

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

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

public List<Integer> getRow3(int rowIndex) {
    List<Integer> list = new ArrayList<Integer>();
    int[] result = new int[1];
    for (int i = 0; i <= rowIndex; i++) {
        int[] next = new int[i + 1];
        next[0] = 1;
        next[i] = 1;
        for (int j = 1; j < i; j++) {
            next[j] = result[j - 1] + result[j];
        }
        result = next;
    }
    for (int in : result) {
        list.add(in);
    }
    return list;
}

05 验证与测试

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

public static void main(String[] args) {
    Easy_119_PascalTriangleII instance = new Easy_119_PascalTriangleII();
    int rowIndex = 3;
    long start = System.nanoTime();
    List<Integer> list = instance.getRow(rowIndex);
    long end = System.nanoTime();
    System.out.println("getRow---输入:"+rowIndex+" , 输出:"+list+" , 用时:"+(end-start)/1000+"微秒");
    long start2 = System.nanoTime();
    List<Integer> list2 = instance.getRow2(rowIndex);
    long end2 = System.nanoTime();
    System.out.println("getRow2---输入:"+rowIndex+" , 输出:"+list2+" , 用时:"+(end2-start2)/1000+"微秒");
    long start3 = System.nanoTime();
    List<Integer> list3 = instance.getRow3(rowIndex);
    long end3 = System.nanoTime();
    System.out.println("getRow3---输入:"+rowIndex+" , 输出:"+list3+" , 用时:"+(end3-start3)/1000+"微秒");
}

测试结果如下:

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

06 小结

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

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

FPGA之道(22)VHDL基本程序框架 在介绍详细的VHDL语法之前,让我们先来了解一下VHDL代码的基本程序框架,这样可以让我们先对VHDL程序设计有一个整体的概念把握,进而在后续的VHDL语法学习中做到有的放矢。 阅读详情

相关推荐

【点云可视化】自制ply文件并使用open3d可视化点云

使用open3d可视化点云,需要将点云制作为ply文件传入函数中。 安装open3d 直接使用pip安装 pip install open3d ply文件 ply文件的结构为:文件头+数据内容,文件头从 ply 一行开始,到 end_header 为止,里面定义了此 ply文件中数据的组织形式,包括数据类型和个数。后面是点云的坐标信息及每个点的颜色属性的,参考自 如下为具有5个点的点云,end_header后每一行表示一个点的x,y,z,R,G,B信息 ply format ascii 1.0 comme

这个人很蓝 1万+

[LeetCode][Java] 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,1]. 题意: 给定序号 k,返回杨辉三角中的第k行。 比如,给定k = 3, 返回[1,3,3,1]. 算法分析: 与题目《Pascal's Triang

西湖有大葱的专栏 550

【SAP-MDG】工作流任务配置实战:从基础配置到代理分配详解

本文详细解析了SAP MDG工作流任务配置的全流程,从基础配置到代理分配的关键操作。通过实战案例和最佳实践,帮助用户掌握Configure Workflow Tasks的核心技巧,包括环境检查、代理分配、SWDD事务码使用及常见问题排查,提升主数据管理效率。

weixin_33738555的博客 250

Java [Leetcode 119]Pascal's Triangle II

题目描述: Given an indexk, return thekthrow of the Pascal's triangle. For example, givenk= 3,Return[1,3,3,1]. 解题思路: 每次在上一个list前面插入1,然后后面的每两个间相加赋值给前一个数。 代码描述: public class Solution { ...

dkk37351的博客 177

GoDaddy域名解析 到 阿里云域名DNS

一:登录GODaddy,点击“个人中心”,然后点击“管理域名” 二:域名解析 第一种:直接解析到对应的服务器 添加一个,类型默认A,主机填写二级域名前缀(image.主域名),指向填写目标服务器ip即可(注意目标服务器80端口是否开放) 第二种:将主域名dns转到阿里云域名下 三:若要修给为阿里云解析服务器,要做以下修改,点击“更改” 点击更改后出现如下页面,此时需要到阿里云官网云解析DNS下添加域名解析 四:阿里云添加域名解析...

xiaolinzi176的博客 6706

华为无线WiFi实战:基于802.1x与NPS的企业级认证部署指南

本文提供了一份详尽的华为无线WiFi企业级认证部署实战指南。通过整合802.1x协议与Windows NPS服务器,构建基于AD域账号的安全认证体系,彻底解决传统WiFi密码共享带来的安全风险。文章详细拆解了从NPS服务器配置、证书部署到华为AC端RADIUS模板、AAA方案、认证域及VAP模板调用的全流程,并附有终端连接测试与常见故障排查方法,助力企业实现高效、安全的无线网络接入管理。

weixin_29239661的博客 272

[LeetCode][119. Pascal's Triangle II][easy]Java实现,杨辉三角

原题: 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?思路:此题是计算杨辉三角的题,比较简单,

u014021258的专栏 670

遗传病变异注释预测工具安装系列之------Exomiser 安装及bug处理

Exomiser是一个Java程序,它从全外显子组或全基因组测序数据中发现潜在的致病变异。 Java 版本必须为1.8以上。 Exomiser 最新版本下载 wget -c https://github.com/exomiser/Exomiser/releases/download/11.0.0/exomiser-cli-11.0.0-distribution.zip unzip ...

qq_37329349的博客 1537

Pascal's Triangle II (Java)

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? 上一行从

豆腐脑是咸的 452

三、Crowd与JIRA、Confluence用户集成并SSO单点登录

补充说明: 通过此方法集成后,用户、组以及用户和组的关系都在Crowd系统中存储,但各个系统的权限仍由各系统控制,也可在JIRA和Confluence中添加和删除用户。 在做步骤4和步骤5的时候,要特别小心,确保当前系统的超级权限用户(一般为admin,具体看当前系统的全局权限配置)和组以及它们的关系已经在Crowd中同样存在了,才可切换并禁用当前系统的内部用户目录,否则可能造成权限丢失等严重问题(因为禁用了内部用户目录,而Crowd中又不存在这个超级权限用户和组或它们的关系,所以权限就丢失了) 维护示例

weixin_38621072的博客 2989

iTunes登录协议全解析:从抓包到加密参数生成(含HTTPDebugger避坑指南)

本文深度解析iTunes登录协议,提供从环境搭建、绕过反调试机制到捕获网络流量的完整实战指南。重点剖析了如何利用HTTPDebugger等工具进行抓包,并详细解读了核心加密参数X-Apple-ActionSignature的生成逻辑,为网络安全研究员和协议分析工程师提供了一份详尽的逆向分析与协议复现教程。

weixin_28314575的博客 870

Pascal's Triangle II -- LeetCode

原题链接:http://oj.leetcode.com/problems/pascals-triangle-ii/这道题跟Pascal's Triangle很类似,只是这里只需要求出某一行的结果。Pascal's Triangle中因为是求出全部结果,所以我们需要上一行的数据就很自然的可以去取。而这里我们只需要一行数据,就得考虑一下是不是能只用一行的空间来存储结果而不需要额外的来存储上一行...

编程语言小筑 267

【雕爷学编程】Arduino动手做(71)---红外遥控器及接收模块3

雕爷学编程,Arduino动手做,开源硬件,创客传感器,红外遥控器及接收模块

雕爷学编程 2292

leetcode:119. Pascal's Triangle II(Java)解答

转载请注明出处:z_zhaojun的博客 原文地址:http://blog.youkuaiyun.com/u012975705/ 题目地址:https://leetcode.com/problems/pascals-triangle-ii/ Pascal’s Triangle II Given an index k, return the kth row of the Pascal's tri

z_zhaojun的博客 2594

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Leetcode】Pascal's Triangle II

题目链接:https://leetcode.com/problems/pascals-triangle-ii/ 题目: 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 opt

业精于勤,荒于嬉 1955

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

杨辉三角,分别求前n行和第n行。 【求杨辉三角前n行】 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,

跳出温水的青蛙 4029

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【LeetCode】解题119:Pascal's Triangle II

LeetCode解题 118:Pascal's Triangle II Problem 118: Pascal's Triangle II [Easy]解题思路Solution (Java) Problem 118: Pascal’s Triangle II [Easy] Given a non-negative index k where k ≤ 33, return the kth index...

Fayedily的博客 446

Leetcode之Pascal's Triangle II 问题

问题描述: Given an index k, return the kth row of the Pascal's triangle. Note: Could you optimize your algorithm to use only O(k) extra space? 示例: For example, given k = 3, Return [1,3,3,1]. 问题

漫漫学习路 273

119. Pascal's Triangle II

Pascal’s Triangle II Easy Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal’s triangle. Note that the row index starts from 0. 题意 LeetCode 118. Pascal’s Triangle(杨辉三角)的...

da_kao_la的博客 142

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

【LeetCode】Pascal’s Triangle II 解题报告标签(空格分隔): LeetCode题目地址:https://leetcode.com/problems/pascals-triangle-ii/description/题目描述:Given an index k, return the kth row of the Pascal’s triangle.For example, g

负雪明烛 868

119. Pascal's Triangle II(杨辉三角简单变形)

Pascal's Triangle II 【题目】 Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note that the row index starts from 0. (翻译:给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行...

yesr的博客 384

LeetCode Pascal's Triangle II

Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Solution: 和Pascal's Triangle没区别。 import java.util.*; public class S

miss_snow_m的专栏 302

[Leetcode] 119. Pascal's Triangle II

link: https://leetcode.com/problems/pascals-triangle-ii/ class Solution { public List<Integer> getRow(int rowIndex) { List<Integer> res = new ArrayList<>(); List&...

Renoler的博客 173

【LeetCode】Pascal's Triangle II

Pascal's Triangle II  Accepted: 11888 Total Submissions: 39509 My Submissions Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Cou

wangzq的专栏 2349

LeetCode 119: Pascal's Triangle II

题目要求:https://leetcode.com/problems/pascals-triangle-ii/ 1)杨辉三角形:第k+1行的第i个元素,等于第k个元素的第i个元素加第i-1个元素 2)为满足空间复杂度为O(k)的需求,可以从第2行开始,每次在list末尾添加一个1,则前k个元素为k-1行的值,这样就可以从后向前计算第k行的元素 AC代码 /*

卡卡罗特 584
上一篇: LeetCode算法题-Pascal's Triangle(Java实现)
下一篇: LeetCode算法题-Best Time to Buy and Sell Stock
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值