【发布时间】:2021-09-09 05:12:36
【问题描述】:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int row = obstacleGrid.size();
int col = obstacleGrid[0].size();
if(obstacleGrid[0][0] == 1){
return 0;
}
if(row = 1 && col == 1){
return 1;
}
vector<vector<int>> dp(row, vector<int>(col, 0));
bool flag = false;
if(col > 1){
for(int i = 0; i < col; i++){
if(flag == true || obstacleGrid[0][i] == 1){
flag = true;
dp[0][i] = 0;
}else{
dp[0][i] = 1;
}
}
if(row == 1){
return dp[0][col - 1];
}
}
flag = false;
if(row > 1){
for(int j = 1; j < row; j++){
if(flag == true || obstacleGrid[j][0] == 1){
flag == true;
dp[j][0];
}else{
dp[j][0] = 1;
}
}
if(col == 1){
return dp[row - 1][0];
}
}
//fill the rest
for(int i = 1; i < row; i++){
for(int j = 1; j < col; j++){
if(obstacleGrid[i][j] == 1){
dp[i][j] = 0;
}else{
dp[i][j] = (dp[i-1][j] + dp[i][j-1]);
}
}
}
return dp[row - 1][col - 1];
}
Testcase
Run Code Result
Debugger
Runtime Error
Line 1034: Char 9: runtime error: reference binding to null pointer of type 'std::vector<int, std::allocator<int>>' (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:9
作为参考,这是关于 leetcode (Unique Paths II) 的问题 58。我设法将错误的来源缩小到这部分代码
if(col > 1){
for(int i = 0; i < col; i++){
if(flag == true || obstacleGrid[0][i] == 1){
flag = true;
dp[0][i] = 0;
}else{
dp[0][i] = 1;
}
}
if(row == 1){
return dp[0][col - 1];
}
}
奇怪的是,它在 VSCode 的 WSL 调试器上正常工作,使用参数 {{0,0,0}, {0,1,0}, {0,0,0}} 它返回“2”,如预期的那样。此外,直到我输入条件 (col > 1) 和 (row > 1) 以避免分别只有 1 列或 1 行的极端情况的缓冲区溢出,它才出现此问题。
【问题讨论】:
-
我认为你错过了,处理
row == 0或col == 0案件,最后你有dp[row - 1][col - 1]。 -
从它看起来的约束来看,m 和 n(行,列)必须至少为 1。无论如何,当行或列之一的值为 1 但如果两者都大于 1 时,它可以工作它会触发错误。