我使用在线编译器来测试我的代码,它运行正常。但是,当我将代码提交给LeetCode时,它总是返回一个随机的负数,如-1218055056。
问题描述如下,
给定m x n网格填充非负数,找到从左上角到右下角的路径,这样可以最小化路径上所有数字的总和。
注意:您只能在任何时间向下或向右移动。
我的代码如下,
class Solution {
public:
int sub(vector<vector<int> >& grid, int** dp, int m, int n) {
if(dp[m][n] == 0) {
if(m==0 && n==0) {
*(*(dp+m)+n) = grid.at(m).at(n);
} else {
if(m == 0) {
*(*(dp+m)+n) = sub(grid, dp, m, n-1);
} else if(n == 0) {
*(*(dp+m)+n) = sub(grid, dp, m-1, n);
} else {
int left = sub(grid, dp, m, n-1);
int up = sub(grid, dp, m-1, n);
*(*(dp+m)+n) = left<up?grid.at(m).at(n)+left:grid.at(m).at(n)+up;
}
}
}
return *(*(dp+m)+n);
}
int minPathSum(vector<vector<int> > &grid) {
int m = grid.size();
int n = grid.at(0).size();
int** dp = new int*[m];
for(int i=0; i<m; i++) {
dp[i] = new int[n];
}
return sub(grid, dp, m-1, n-1);
}
};
有谁知道为什么?
提前致谢。
答案 0 :(得分:0)
Nabla是对的,用dp[i] = new int[n];
替换dp[i] = new int[n]();
可以解决问题。
答案 1 :(得分:0)
我对评论的建议:
for(int i=0; i<m; i++) {
dp[i] = new int[n];
}
return sub(grid, dp, m-1, n-1);
此处dp[i]
不零初始化,dp[i]
的值不确定,因为dp
传递给{{ 1}}。在sub
中,值会在分配之前读取,因此行为可能非常意外,特别是sub
将从sub
返回不确定的值而不执行任何其他操作,如果dp
1}}不是零,因为这个测试:
dp[m][n]
您可能很幸运,代码与您的编译器正确运行。要在声明时正确地初始化值,请使用:
if(dp[m][n] == 0) {