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

相关推荐
靴子学长2 小时前
Qwen3.5 架构手撕源码
算法·架构·大模型
寒月小酒2 小时前
3.28 OJ
算法
aloha_7892 小时前
软考高项-第二章-信息技术发展
java·人工智能·python·学习
寒秋花开曾相惜2 小时前
(学习笔记)3.8 指针运算(3.8.5 变长数组)
java·c语言·开发语言·笔记·学习
AI成长日志2 小时前
【笔面试算法学习专栏】堆与优先队列专题:数组中的第K个最大元素与前K个高频元素
学习·算法·面试
AI-Ming2 小时前
程序员转行学习 AI 大模型: 踩坑记录,HuggingFace镜像设置未生效
人工智能·pytorch·python·gpt·深度学习·学习·agi
talen_hx2963 小时前
《零基础入门Spark》学习笔记 Day 07
笔记·学习·spark
雅俗共赏1003 小时前
医学图像重建中常用的正则化分类
算法
IronMurphy3 小时前
【算法三十二】
算法