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

相关推荐
非优秀程序员4 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
Godspeed Zhao4 小时前
从零开始学AI25——无监督学习之层次聚类
学习·机器学习·聚类
武子康10 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
David猪大卫11 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger11 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
fengci.12 小时前
CTF2MISC中等部分
开发语言·前端·学习
YueTann14 小时前
mgtv5th-baseline学习
学习
蒸蒸yyyyzwd15 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气15 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity