【发布时间】:2020-01-11 17:39:01
【问题描述】:
背景 今天面试,被问到以下问题。
给你一个网格。
int [][] grid =
{
{0,0,0,2,5},
{0,0,0,1,5},
{0,1,1,1,1},
{2,0,0,0,0}
};
您从网格的左下角开始。您只能向上和向右。我们的想法是到达右上角。你要走能让你获得最大价值的道路。
上面的输出是 16
我的解决方案
public static int getPathMaxSum(int [][] grid){
int row = grid.length-1;
int col = 0;
int currentSum = grid[row][col];
return getMax(grid,currentSum,row,col);
}
public static int getMax(int [][] grid,int sum,int row,int col){
if((isTopRight(grid,row,col)) || (!isValid(grid,row,col))){
return sum;
}else{
sum = sum + grid[row][col];
return Math.max(getMax(grid,sum,row-1,col),getMax(grid,sum,row,col+1));
}
}
public static boolean isTopRight(int [][] grid, int row, int col){
return row == 0 && col == grid[row].length-1;
}
public static boolean isValid(int [][] grid, int row, int col){
return (row >= 0 && row < grid.length) && (col >= 0 && col < grid[row].length);
}
我正在尝试递归解决这个问题。我认为我在每个位置都有 2 个可能的选择,我想获得这两个选择中的最大值,但由于某种原因我无法获得正确的输出。
我有两个辅助函数来检查我的位置是否在网格内的有效含义以及我是否点击了右上角,如果我点击了我的基本情况。
我很想看看我哪里出错了。
【问题讨论】:
-
getMax返回一个int。但是这两个递归调用对返回的总和没有任何作用。 -
您应该选择两个递归调用中的最大值,然后将其添加到您的
currSum,然后最后返回 - 所以return currSum + Math.max( getMax(grid, sum, row+1, col), getMax(grid, sum, row, col+1) ); -
@SomeDude 是否可以将其添加为答案
-
@Dinero 我的建议解决了你的问题吗?
-
@SomeDude 我实际上尝试了你的建议,但它不起作用。
标签: java algorithm recursion dynamic-programming backtracking