LeetCode有序二维数组搜索:element变量更新位置错误原因问询
为什么将element更新语句移到循环末尾会导致矩阵搜索代码报错?
这是典型的数组越界访问问题,咱们一步步拆解原因:
原代码的正确逻辑
原代码从矩阵右上角(rowIndex=0, colIndex=tcol-1)开始搜索,流程是:
- 循环条件先确认当前索引
rowIndex < trow且colIndex >=0,保证索引合法 - 读取当前合法位置的元素
element - 根据
element和target的大小关系,移动行/列索引 - 重复上述步骤直到找到目标或索引越界
移到循环末尾为什么会报错?
当你把element = matrix[rowIndex][colIndex];移到循环末尾时,执行顺序完全颠倒了:
- 进入循环时索引是合法的,但先执行了
colIndex--或rowIndex++调整索引 - 直接去更新
element,这时候新的索引可能已经超出矩阵的合法范围!
举两个极端场景:
- 如果
target比矩阵里所有元素都大:rowIndex会一直递增,直到rowIndex == trow(此时循环条件rowIndex < trow已不满足),但最后一次循环中,rowIndex从trow-1变成trow后,直接执行matrix[trow][colIndex]——矩阵行索引范围是0~trow-1,触发行索引越界。 - 如果
target比矩阵里所有元素都小:colIndex会一直递减到-1,最后一次循环执行matrix[rowIndex][-1]——列索引不能为负数,触发列索引越界。
怎么修正?
如果你非要把更新语句放末尾,必须在更新前再次判断索引合法性,但这会造成逻辑冗余,完全没必要。最合理的写法还是保持原代码的逻辑:先在循环开头读取当前合法索引的元素,再调整索引。
仅作演示的冗余修正写法(不推荐):
while(rowIndex < trow && colIndex >= 0){ if(element == target){ return 1; } if(element > target){ colIndex --; } if(element < target){ rowIndex ++; } // 先判断索引合法再更新element if(rowIndex < trow && colIndex >= 0){ element = matrix[rowIndex][colIndex]; } }
显然原代码的写法更简洁高效,没必要多此一举。
内容的提问来源于stack exchange,提问作者Ankush Makkar
相关产品推荐
相关产品推荐

