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

LeetCode有序二维数组搜索:element变量更新位置错误原因问询

为什么将element更新语句移到循环末尾会导致矩阵搜索代码报错?

这是典型的数组越界访问问题,咱们一步步拆解原因:

原代码的正确逻辑

原代码从矩阵右上角(rowIndex=0, colIndex=tcol-1)开始搜索,流程是:

  1. 循环条件先确认当前索引rowIndex < trow且colIndex >=0,保证索引合法
  2. 读取当前合法位置的元素element
  3. 根据element和target的大小关系,移动行/列索引
  4. 重复上述步骤直到找到目标或索引越界

移到循环末尾为什么会报错?

当你把element = matrix[rowIndex][colIndex];移到循环末尾时,执行顺序完全颠倒了:

  1. 进入循环时索引是合法的,但先执行了colIndex--或rowIndex++调整索引
  2. 直接去更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:27:17