LeetCode-热题100:240. 搜索二维矩阵 II

题目描述

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

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

示例 1:

在这里插入图片描述

输入: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出: true

示例 2:
在这里插入图片描述

输入: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出: false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -109<= matrix[i][j] <= 109
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -109 <= target <= 109

代码及注释

func searchMatrix(matrix [][]int, target int) bool {
    // 初始化指针,right指向每行的最后一个元素,top指向第一行
    right := len(matrix[0]) - 1
    top := 0

    // 循环,直到top超出矩阵的行数或者right小于0
    for top < len(matrix) && right >= 0 {
        // 如果找到目标值,返回true
        if matrix[top][right] == target {
            return true
        } 
        // 如果当前元素小于目标值,说明目标值可能在当前行的后面部分,top指针下移
        else if matrix[top][right] < target {
            top++
        } 
        // 如果当前元素大于目标值,说明目标值可能在当前列的前面部分,right指针左移
        else {
            right--
        }
    }
    // 循环结束后还未找到目标值,返回false
    return false
}

代码解释

矩阵有以下特点:

  1. 矩阵中的每一行都是按照从左到右递增的顺序排序。
  2. 矩阵中的每一列都是按照从上到下递增的顺序排序。

因此,我们可以利用这两个特性进行高效的查找。

  1. 初始化指针:

    • right 指向每行的最后一个元素。
    • top 指向第一行。
  2. 循环查找:

    • top 小于矩阵的行数并且 right 大于等于0时,执行循环。
    • 如果找到目标值,返回 true
    • 如果当前元素小于目标值,说明目标值可能在当前行的后面部分,所以 top 指针下移。
    • 如果当前元素大于目标值,说明目标值可能在当前列的前面部分,所以 right 指针左移。
  3. 返回结果:

    • 如果循环结束还未找到目标值,返回 false

这个算法的时间复杂度是O(m + n),其中m是矩阵的行数,n是矩阵的列数。这是一个非常高效的方法,因为它在每次迭代中都排除了一行或一列,直到找到目标值或者遍历完整个矩阵。

相关推荐

  1. LeetCode100】【矩阵搜索矩阵 II

    2024-04-02 12:06:04       15 阅读
  2. leetcodeHOT 240. 搜索矩阵 II

    2024-04-02 12:06:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-02 12:06:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-02 12:06:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-02 12:06:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-02 12:06:04       18 阅读

热门阅读

  1. 4.1作业

    4.1作业

    2024-04-02 12:06:04      9 阅读
  2. ElasticSearch 实战:ElasticSearch文档多条件查询

    2024-04-02 12:06:04       11 阅读
  3. FIFO控制器设计——日常学习

    2024-04-02 12:06:04       10 阅读
  4. 关系型数据库与非关系型数据库、Redis数据库

    2024-04-02 12:06:04       17 阅读
  5. vue记事本渲染以及交互

    2024-04-02 12:06:04       15 阅读
  6. docker compose部署项目—踩坑记录

    2024-04-02 12:06:04       13 阅读
  7. Linux中的用户和组管理

    2024-04-02 12:06:04       12 阅读
  8. Go-Gin全局错误处理中间件

    2024-04-02 12:06:04       11 阅读
  9. C++ TCP 服务端和客户端通信的例子

    2024-04-02 12:06:04       12 阅读
  10. 前端 prefetch 和 preload 的区别?

    2024-04-02 12:06:04       14 阅读
  11. Yarn 包管理器入门指南

    2024-04-02 12:06:04       14 阅读
  12. linux定时调度任务

    2024-04-02 12:06:04       12 阅读