LeetCode搜索二维矩阵算法触发Segmentation fault段错误求解
问题根因
- 目标矩阵的全局升序为行优先顺序,标准1D索引转2D坐标的规则应为
行 = 1D索引 / 列数、列 = 1D索引 % 列数 - 现有iT函数硬编码使用成员变量
rows作为除数和模值,你之前的代码将rows赋值为矩阵行数,导致坐标转换逻辑完全错位:当矩阵行数不等于列数时,会出现行/列越界访问,触发段错误。 - 以失败用例
[[1,1]]为例:矩阵行数为1、列数为2,rows被赋值为1,当二分查找的1D索引为1时,1/1=1得到行号为1,直接超出行号最大为0的边界,触发段错误。
修复方案
要求保留iT函数实现不变,我们只需调整成员变量rows的赋值逻辑,将其赋值为矩阵的列数,即可让iT的转换规则刚好匹配行优先的坐标转换要求,同时补充空矩阵边界校验避免非法访问。
修改后完整代码如下:
class Solution { public: int rows = 0; bool searchMatrix(vector<vector<int>>& matrix, int target) { // 空矩阵边界校验 if (matrix.empty() || matrix[0].empty()) { return false; } int real_rows = matrix.size(); int cols = matrix[0].size(); // 将成员变量rows赋值为列数,适配iT现有实现 rows = cols; return binarySearch(matrix, 0, real_rows * cols - 1, target); } private: pair<int, int> iT(int index) { // index translation 实现完全未修改 cout << '[' << index/rows << ',' << index%rows << ']' << endl; return {index/rows, index%rows}; } bool binarySearch(vector<vector<int>> & matrix, int l, int r, int x) { if (r >= l) { int mid = l + (r - l) / 2; if ( matrix[iT(mid).first][iT(mid).second] == x) return true; if ( matrix[iT(mid).first][iT(mid).second] > x) return binarySearch(matrix, l, mid - 1, x); return binarySearch(matrix, mid + 1, r, x); } return false; } };
验证效果
- 失败用例
[[1,1]]、target=2:成员变量rows被赋值为2,1D索引1转换后得到坐标(0,1),无越界,最终正确返回false。 - 官方示例3行4列矩阵、target=3:成员变量
rows被赋值为4,1D索引1转换后得到(0,1),对应元素3,正确返回true。
内容的提问来源于stack exchange,提问作者hsuecu
相关产品推荐
相关产品推荐

