C++求解LeetCode不同路径II报vector空指针引用运行时错误
错误触发原因
- 核心语法笔误篡改行数值:代码中
if(row = 1 && col == 1)使用了赋值运算符=而非相等判断运算符==,由于C++中&&优先级高于=,实际执行逻辑为row = (1 && col == 1),会直接把原本存储行数的row变量覆盖为0或1。如果row被赋值为0,后续创建的dp数组是空vector,访问dp[0][i]时就会触发空指针引用的运行时错误,和你收到的报错信息完全匹配。 - 第一列初始化逻辑笔误:处理第一列的代码段存在两处无效写法:
- 遇到障碍物后对flag的赋值写为了判断语句
flag == true,没有实际修改flag的值 - dp赋值语句写为了无意义的表达式
dp[j][0];,没有给对应位置赋值,会导致第一列计算结果异常
- 遇到障碍物后对flag的赋值写为了判断语句
- 边界值初始化遗漏:新增
col>1判断后,当col=1时不会进入第一行初始化逻辑,起点dp[0][0]保留初始值0,和实际应该设置的1不符,会导致单列用例结果错误。
修复方案
你新增的col>1、row>1判断完全不需要,因为前面已经单独处理了row==1、col==1的边界场景,处理完成后会直接return,不会进入后续循环触发越界。修复后的完整代码如下:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { // 提前判空避免输入为空时访问越界 if(obstacleGrid.empty() || obstacleGrid[0].empty()){ return 0; } 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)); // 统一初始化起点值 dp[0][0] = 1; bool flag = false; // 初始化第一行 for(int i = 0; i < col; i++){ if(flag || 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; // 初始化第一列 for(int j = 1; j < row; j++){ if(flag || obstacleGrid[j][0] == 1){ // 修复双等号为赋值操作 flag = true; // 修复遗漏的dp赋值 dp[j][0] = 0; }else{ dp[j][0] = 1; } } if(col == 1){ return dp[row - 1][0]; } // 填充dp表剩余部分 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]; }
修复的核心点:
- 把错误的赋值判断改为相等判断
row == 1 - 修正第一列初始化的两处笔误
- 新增输入空值判断,避免极端输入下的越界
- 移除不必要的
col>1、row>1判断,避免边界初始化遗漏
内容的提问来源于stack exchange,提问作者VJW96
相关产品推荐
相关产品推荐

