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

本文介绍了一种高效的算法,用于在给定的有序矩阵中搜索目标值。通过维护两个指针,一个指向行尾,一个指向列首,根据矩阵的递增顺序逐步缩小搜索范围,最终确定目标值是否存在,时间复杂度为O(m+n)。
摘要由CSDN通过智能技术生成

题目描述

编写一个高效的算法来搜索 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是矩阵的列数。这是一个非常高效的方法,因为它在每次迭代中都排除了一行或一列,直到找到目标值或者遍历完整个矩阵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值