【每天学习一点算法 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)

相关推荐
致Great5 小时前
Pi 的上下文压缩,到底是怎么工作的?
算法
Linux-lucky6 小时前
21-Linux学习之旅之HTTPS和安全加固
linux·运维·学习·ubuntu·https
watersink6 小时前
机器学习聚类算法
算法·机器学习·聚类
luj_17687 小时前
桥牌思维启示:系统设计的模块化架构
c语言·开发语言·c++·经验分享·算法
学运维的Kysan8 小时前
暑假运维学习打卡第二十六天8.17
学习
dear_bi_MyOnly9 小时前
AI人工智能分类识别——机器如何学习
人工智能·学习·分类
饼饼学习空间智能9 小时前
家庭服务机器人训练数据怎么积累?仿真、真实采集与持续学习的技术路线分析
人工智能·算法·机器学习
蛋先生DX10 小时前
你瘦不下来但大模型可以:量化原理了解一下
深度学习·算法·llm
启雀AI11 小时前
培训平台移动端离线学习方案设计与实现:视频缓存、断点续传与进度同步的工程实践
android·学习·缓存·音视频·企业lms