LeetCode 74.搜索二维矩阵出现堆缓冲区溢出,遗漏了什么条件?
错误原因
你写的while循环边界条件存在错误:
- 变量
i是矩阵的行索引,合法取值范围是0 ~ m(m是矩阵行数减1),但你在循环判断中写的是i <= n,n是矩阵列数减1,当矩阵行数小于列数时,会出现行索引越界访问的问题。
我们用你给出的失败测试用例复现错误过程:
- 测试用例矩阵为
[[-1,3]],对应m=0(共1行,行索引最大为0),n=1(共2列,列索引最大为1),目标值为1 - 第一次循环:
i=0, j=1,目标值1小于matrix[0][1]的3,j减为0 - 第二次循环:
i=0, j=0,目标值1大于matrix[0][0]的-1,i加为1 - 第三次循环判断
i<=n即1<=1成立,尝试访问matrix[1][0],但矩阵不存在索引为1的行,触发堆缓冲区溢出错误。
修复方案
只需要把while循环的行索引判断条件从i<=n改为i<=m即可,修正后的完整代码如下:
bool searchMatrix(vector<vector<int>>& matrix, int target) { int m=matrix.size()-1, n= matrix[0].size()-1; int i=0, j=n; int small=matrix[0][0], large=matrix[m][n]; if(target<small || target>large)return false; while(i<=m && j>=0){ if(target==matrix[i][j])return true; if(target<matrix[i][j])j--; else i++; } return false; }
内容的提问来源于stack exchange,提问作者Ankita Prasad
相关产品推荐
相关产品推荐

