杨辉三角 的算法实现

杨辉三角形是排列成三角形的一系列数字。 在杨辉三角形中,每一行的最左边和最右边的数字总是 1。 对于其余的每个数字都是前一行中直接位于它上面的两个数字之和。

下面给出一个5行的杨辉三角:

基本情况

可以看到,每行的最左边和最右边的数字是基本情况,在这个问题中,它总是等于 1。

因此,我们可以将基本情况定义如下:

f(i,j) = 1 where j=1 or j=i

递推关系

让我们从杨辉三角形内的递推关系开始。

首先,我们定义一个函数 f(i, j)它将会返回杨辉三角形第 i 行、第 j 列的数字。

我们可以用下面的公式来表示这一递推关系:

f(i,j)=f(i−1,j−1)+f(i−1,j)

java 实现

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

示例:

输入: 5

输出:

[

[1],

[1,1],

[1,2,1],

[1,3,3,1],

[1,4,6,4,1]

]

1

2

3

4

5

6

7

8

9

10

11

输入:5

输出:

[

[1],

[1,1],

[1,2,1],

[1,3,3,1],

[1,4,6,4,1]

]

方法一 迭代实现

public List generateTrangle(int numRows){

List> list = new ArrayList<>();

for(int i=0;i

List subList = new ArrayList<>();

list.add(subList);

for(int j=0;j

f(j==i||j==0){//每行的最左边和最右边的数字都是1

subList.add(1);

}else{

//递推关系

subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));

}

}

}

return list;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

publicListgenerateTrangle(intnumRows){

List>list=newArrayList<>();

for(inti=0;i

ListsubList=newArrayList<>();

list.add(subList);

for(intj=0;j

f(j==i||j==0){//每行的最左边和最右边的数字都是1

subList.add(1);

}else{

//递推关系

subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));

}

}

}

returnlist;

}

方法二 递归实现

public List> generateTriangleByRecursive(int numRow) {

List> list = new ArrayList<>();

for (int i = 0; i < numRow; i++) {

List subList = new ArrayList<>();

for (int j = 0; j < i + 1; j++) {

subList.add(generate_Triangle_by_recursive(i, j));

}

list.add(subList);

}

return list;

}

private int generate_Triangle_by_recursive(int i, int j) {

int result;

if (j == 0 || j == i) {

result = 1;

} else {

result =

(generate_Triangle_by_recursive(i - 1, j - 1) + generate_Triangle_by_recursive(

i - 1, j));

}

return result;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

publicList>generateTriangleByRecursive(intnumRow){

List>list=newArrayList<>();

for(inti=0;i

ListsubList=newArrayList<>();

for(intj=0;j

subList.add(generate_Triangle_by_recursive(i,j));

}

list.add(subList);

}

returnlist;

}

privateintgenerate_Triangle_by_recursive(inti,intj){

intresult;

if(j==0||j==i){

result=1;

}else{

result=

(generate_Triangle_by_recursive(i-1,j-1)+generate_Triangle_by_recursive(

i-1,j));

}

returnresult;

}

在上面的例子中,您可能已经注意到递归解决方案可能会导致一些重复的计算,例如,我们重复计算相同的中间数以获得最后一行中的数字。 举例说明,为了得到 f(5, 3) 的结果,我们在 f(4, 2) 和 f(4, 3) 的调用中计算了 f(3, 2) 两次。下面我们优化递归算法

方法三 递归+记忆化

public List> generateTriangleByRecursive(int numRow) {

List> list = new ArrayList<>();

Map> cacheMap = new HashMap<>();

for (int i = 0; i < numRow; i++) {

List subList = new ArrayList<>();

for (int j = 0; j < i + 1; j++) {

subList.add(generate_Triangle_by_recursive(i, j, cacheMap));

}

list.add(subList);

}

return list;

}

private int generate_Triangle_by_recursive(int i, int j,

Map> cacheMap) {

if (cacheMap.containsKey(i) && cacheMap.get(i).containsKey(j)) {

return cacheMap.get(i).get(j);

}

int result;

if (j == 0 || j == i) {

result = 1;

} else {

result =

(generate_Triangle_by_recursive(i - 1, j - 1, cacheMap) + generate_Triangle_by_recursive(

i - 1, j, cacheMap));

}

if (!cacheMap.containsKey(i)) {

Map map = new HashMap<>();

cacheMap.put(i, map);

}

cacheMap.get(i).put(j, result);

return result;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

publicList>generateTriangleByRecursive(intnumRow){

List>list=newArrayList<>();

Map>cacheMap=newHashMap<>();

for(inti=0;i

ListsubList=newArrayList<>();

for(intj=0;j

subList.add(generate_Triangle_by_recursive(i,j,cacheMap));

}

list.add(subList);

}

returnlist;

}

privateintgenerate_Triangle_by_recursive(inti,intj,

Map>cacheMap){

if(cacheMap.containsKey(i)&&cacheMap.get(i).containsKey(j)){

returncacheMap.get(i).get(j);

}

intresult;

if(j==0||j==i){

result=1;

}else{

result=

(generate_Triangle_by_recursive(i-1,j-1,cacheMap)+generate_Triangle_by_recursive(

i-1,j,cacheMap));

}

if(!cacheMap.containsKey(i)){

Mapmap=newHashMap<>();

cacheMap.put(i,map);

}

cacheMap.get(i).put(j,result);

returnresult;

}

拓展算法

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

示例:

输入: 3

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

1

2

3

4

输入:3

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

public List getRow(int rowIndex) {

List> list = new ArrayList<>();

for(int i=0;i

List subList = new ArrayList<>();

list.add(subList);

for(int j=0;j

if(j==i||j==0){//first and end

subList.add(1);

}else{

subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));

}

}

}

return list.get(rowIndex);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

publicListgetRow(introwIndex){

List>list=newArrayList<>();

for(inti=0;i

ListsubList=newArrayList<>();

list.add(subList);

for(intj=0;j

if(j==i||j==0){//first and end

subList.add(1);

}else{

subList.add((list.get(i-1).get(j-1)+list.get(i-1).get(j)));

}

}

}

returnlist.get(rowIndex);

}

java递归输出杨辉三角,杨辉三角算法 | zhangman523相关推荐

  1. python杨辉三角输出指定行_python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解...

    如何用python输出杨辉三角 程序输出需要实现如下效果: [1] [1,1] [1,2,1] [1,3,3,1] .. 方法:迭代,生成器 12345678910111213141516171819 ...

  2. java实现a3打印_javase 打印杨辉三角

    下面用java写一个打印10行杨辉三角的程序,其中用到的是二维数组 package com.test001; //本实例打印10行杨辉三角 /* * 1 * 1 1 * 1 2 1 * 1 3 3 1 ...

  3. C语言 生成并输出一个杨辉三角的前7行,分别按左下三角,右下三角以及金字塔形式输出。

    生成并输出一个杨辉三角的前7行,分别按左下三角,右下三角以及金字塔形式输出. #include <stdio.h> int main(){//左边的杨辉三角int a[7][7],i,j; ...

  4. HTML 杨辉三角,杨辉三角的实现

    代码: import java.math.BigInteger; public class Main { static int N=12;//输出多少行 static int max= C(N/2,N ...

  5. 杨辉三角(下三角或者等腰三角)

    //杨辉三角(下三角或者等腰三角) #include <stdio.h> int fun(int i,int j) { if(i==j||1==j) return 1; else retu ...

  6. 【Java基础】递归输出目录下所有文件路径

    递归输出目录下所有文件路径 import java.io.File;public class FileTest {public static void main(String[] args) {// ...

  7. java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例

    本文实例讲述了java实现二叉树的建立.计算高度与递归输出操作.分享给大家供大家参考,具体如下: 1. 建立 递归输出 计算高度 前中后三种非递归输出 public class Tree_Link { ...

  8. java json数据输出,java服务器端输出JSON格式数据

    java服务器端输出JSON格式数据 本文我们讨论如何在服务器端输出 JSON 格式的数据.以 Java 为例,我们将演示将一个 Java 对象编码为 JSON 格式的文本. 将 String 对象编 ...

  9. java 递归 堆栈_Java中的堆栈安全递归

    java 递归 堆栈 在本文中,摘自< Java中的函数编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为 ...

最新文章

  1. 高危Windows 0day漏洞:看一眼就中毒
  2. 关于php语言的使用!
  3. mdi 子窗体 菜单 不合并。
  4. Linux下matlab断点调试
  5. net 控制台 定时_.NET Core实现基于Quart.Net的任务管理
  6. nmap结果导出html,nmap的简单使用 - osc_ijgldkz9的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. linux之vim操作快速跳到下一个空格和上一个空格命令
  8. NOI图论算法:网络流
  9. 多个ajax执行混乱问题
  10. Kubernetes PV与PVC
  11. 一个指针占几个字节?原理是什么呢?
  12. 【计算机视觉】关于计算机视觉(随谈)
  13. 2021肇庆各中学高考成绩查询入口,2021高考即将来袭!肇庆各学校的同学们准备好了吗?...
  14. 虚拟服务器共享文件夹端口,如何查看共享文件夹端口
  15. 微信删除的聊天记录怎么恢复?2招快速解决
  16. 解决spring定时任务执行两次和tomcat部署缓慢的问题
  17. pi在c语言中代表什么6,《光纤通信技术》综合练习
  18. 输入法pad版android,百度输入法pad版 for android 3.0
  19. 在Ubuntu上安装CERTI
  20. 我的第一个开源库-DialogLoading弹出加载框(Kotlin版)

热门文章

  1. Java实现五子棋小游戏(附源码)
  2. 2018年度硬件–Apple Watch Series 4、Xbox等自适应控制器
  3. spider pi 智能视觉六足机器人自动避障 0604
  4. Luogu4338 ZJOI2018 历史 LCT、贪心
  5. Java学习-17 正则表达式简述
  6. java中QQ号、手机号、邮箱号的正则表达式
  7. 蒙特卡洛期权价格模拟(包括最小二乘美式期权模拟)
  8. js与jQuery的区别以及jQuery选择器和方法的使用
  9. 一个不怕机器识别的图形验证码方案
  10. 决战私服与服务器不稳定,Droiyan online决战私服合区教程