[leetcode] Search a 2D Matrix
发布日期:2021-05-08 04:51:08 浏览次数:24 分类:精选文章

本文共 2008 字,大约阅读时间需要 6 分钟。

写一个高效搜索二维矩阵的算法

在编程中,经常需要在一个二维矩阵中搜索特定的值。对于一个m行n列的矩阵,如果没有特殊结构,这个问题通常可以通过逐行逐列地搜索来解决。但如果矩阵具有特定的结构,我们可以利用这些结构特性来实现更高效的搜索算法。

下面描述一个高效的搜索算法,结合了矩阵的特性:

矩阵的结构特性

  • 每行排序:矩阵中的每一行都是从左到右递增的。
  • 行与行之间的关系:每一行的第一个元素都大于上一行的最后一个元素。
  • 算法思路

    我们可以利用矩阵的行与行之间的关系和每行内部的有序性来优化搜索过程。具体步骤如下:

  • 确定目标值所在的行:由于每行的第一个元素都大于上一行的最后一个元素,我们可以利用二分查找的方式来确定目标值所在的行。
  • 在确定的行中使用二分查找:找到目标值所在的行后,在该行中再次使用二分查找来确定具体的位置。
  • 通过这种方法,我们可以将二维问题转化为两个一维二分查找问题,从而大大减少搜索时间。

    详细步骤

    第一步:确定目标值所在的行

  • 初始化行范围:设置当前搜索行的范围为1到m。
  • 计算中间行:计算当前行范围的中间行。
  • 比较中间行的最后一个元素
    • 如果中间行的最后一个元素小于目标值,那么目标值可能在中间行之后的行。
    • 如果中间行的最后一个元素大于目标值,那么目标值可能在中间行之前的行。
    • 如果中间行的最后一个元素等于目标值,那么目标值已经找到。
  • 调整行范围:根据比较结果,调整行搜索范围,继续进行二分查找。
  • 第二步:在确定的行中使用二分查找

  • 确定目标值所在的行后,将目标值所在的行作为当前行。
  • 初始化列范围:设置当前列的范围为1到n。
  • 计算中间列:计算当前列范围的中间列。
  • 比较中间列的元素
    • 如果中间列的元素小于目标值,那么目标值可能在中间列之后的列。
    • 如果中间列的元素大于目标值,那么目标值可能在中间列之前的列。
    • 如果中间列的元素等于目标值,那么目标值已经找到。
  • 调整列范围:根据比较结果,调整列搜索范围,继续进行二分查找。
  • 代码实现示例

    以下是一个基于上述算法的代码实现示例(假设矩阵为matrix,目标值为target):

    bool searchMatrix(vector
    > matrix, int target) { int m = matrix.size(); if (m == 0) return false; int n = matrix[0].size(); if (n == 0) return false; // 第一步:确定目标值所在的行 int low = 1; int high = m; int row; while (low <= high) { int mid = (low + high) / 2; int lastElementOfMidRow = matrix[mid][n - 1]; if (lastElementOfMidRow < target) { low = mid + 1; } else if (lastElementOfMidRow > target) { high = mid - 1; } else { row = mid; break; } } // 第二步:在确定的行中使用二分查找 if (row == -1) return false; // 如果行未找到,返回false low = 1; high = n; while (low <= high) { int mid = (low + high) / 2; if (matrix[row][mid] == target) { return true; } else if (matrix[row][mid] < target) { low = mid + 1; } else { high = mid - 1; } } return false;}

    优化思路总结

  • 行优先搜索:首先利用行之间的关系确定目标值所在的行,这一步的时间复杂度为O(log m)。
  • 列优先搜索:在确定的行中,再利用列的有序性进行二分查找,时间复杂度为O(log n)。
  • 总体复杂度:整个算法的时间复杂度为O(log m + log n),这大大优于传统的逐个遍历方法(O(mn))。
  • 通过这种方法,我们可以在给定的矩阵中高效地搜索目标值,充分利用了矩阵的结构特性。

    上一篇:Jenkins部署.net自动化构建
    下一篇:.Net 使用 Aspose.Words 进行 Word替换操作

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年05月04日 21时12分44秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章