题目
- 数字三角形:即由数字组成三边的三角形。
例如:
7
38
810
2744
45265 - 问题:如何求解某点到底边所能获得的最大值路径。
解题
由于直接使用递归求解的话,时间复杂度过大O(2^n),会超时而无法计算,因此我们一般不采用递归。
解法1
采用多一个二维数组,存储当前数值到结尾所能走的最大值,避免 同一个结果重复计算n次。
//数字三角形(递归思想+记忆数组避免运算重复)
//传入的ij是三角形的起始点
public static void digTalTriangleByRecursion(int i,int j,int tri[][]){
int a = tri.length;
int b=tri[0].length;
int maxSum[][]=new int[a][b];
for (int m=0;m<a;m++){
for (int n=0;n<b;n++) {
maxSum[m][n] = -1;
}
}
System.out.println("最大值是:"+maxNum(i,j,tri,maxSum));
}
private static int maxNum(int i,int j,int tri[][],int maxSum[][]){
if(maxSum[i][j]!=-1){ //已经计算过最大值
return maxSum[i][j];
}
if(i==tri.length-1){
maxSum[i][j]=tri[i][j];
}else{
int x=maxNum(i+1,j,tri,maxSum);
int y=maxNum(i+1,j+1,tri,maxSum);
maxSum[i][j]=Math.max(x,y)+tri[i][j];
}
return maxSum[i][j];
}

这篇博客探讨了数字三角形问题,如何求解从某点到底边的最大值路径。由于直接递归时间复杂度过高,作者提出了三种解题方法:1) 使用额外二维数组存储最大值;2) 从下往上的一维数组递推更新;3) 从最后一行递推,减少空间占用并降低时间复杂度。
最低0.47元/天 解锁文章
1664

被折叠的 条评论
为什么被折叠?



