【每天学习一点算法 2026/03/29】搜索二维矩阵 II

每天学习一点算法 2026/03/29

题目:搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。

每列的元素从上到下升序排列。

  1. 最容易想到办法就是遍历矩阵,我们可以调整一下遍历条件,但是极端情况还是 O(mn) 时间复杂度

    typescript 复制代码
    function searchMatrix(matrix: number[][], target: number): boolean {
      let maxRow = matrix.length
      let maxCol = matrix[0].length
      for (let i = 0; i < maxRow; i++) {
        for (let j = 0; j < maxCol; j++) {
          if (matrix[i][j] === target) {
            return true
          }
          if (matrix[i][j] > target) {
            // 根据遍历结果不断缩小行的边界
            if (j === 0) return false
            maxCol = j
          }
        } 
      }
      return false
    };
  2. 每一行否是递增的数组,我们可以用二分法去在每行查找目标。

    typescript 复制代码
    function searchMatrix(matrix: number[][], target: number): boolean {
      let maxRow = matrix.length
      function helper (nums: number[]) {
        let left = 0, right = nums.length
        while (left <= right) {
          const mid = Math.floor((left + right) / 2)
          if (nums[mid] == target) return true
          if (nums[mid] > target) right = mid - 1
          else left = mid + 1
        }
        return false
      }
      for (let i = 0; i < maxRow; i++) {
         const isFind = helper(matrix[i])
         if (isFind) return true
      }
      return false
    };
  3. 我们其实可以发现每次遍历我们都可以缩小行的边界,那么我们可以从 [0, n - 1] 处开始遍历,如果 matrix[i][j] 大于 目标值,那么就 j--,否则 i++,直到碰到边界还没找到,就是没有目标值

    typescript 复制代码
    function searchMatrix(matrix: number[][], target: number): boolean {
      let i = 0
      let j = matrix[0].length - 1
      while (i < matrix.length && j >= 0) {
        if (matrix[i][j] === target) return true
        if (matrix[i][j] > target) {
          j--
        } else {
          i++
        }
      }
      return false
    };

题目来源:力扣(LeetCode)

相关推荐
imuliuliang3 小时前
关于数据结构在算法设计中的核心作用解析7
算法
2401_894915535 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
MartinYeung55 小时前
[论文学习]自主性如何重塑个性化对LLM智能体隐私关切与信任的影响
人工智能·学习
普通网友6 小时前
共识算法实现:从工作量证明到权益证明的演进
算法·区块链·共识算法
FellAveal6 小时前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
菜鸟‍6 小时前
【论文学习】MICCAI 2024 || SGSeg:通过自引导机制实现胸部X光片语言引导分割的无文本推理
人工智能·深度学习·学习
lazy H6 小时前
Git clone 怎么用?克隆项目及常见问题完整教程
大数据·git·后端·学习·搜索引擎·github
菜鸟‍6 小时前
【论文学习】arxiv 2024 || RoSIS:基于鲁棒框架重新审视文本提示式手术器械分割
人工智能·学习·计算机视觉
ldmd2847 小时前
地图生成算法(噪声篇-Perlin,Simplex,Value noise)
算法·go·地图生成