You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:45:02