LeetCode hot 100 每日一题(16)——240. 搜索二维矩阵 II

这是一道难度为中等的题目,让我们来看看题目描述:

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

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



提示:

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

题解

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        // 获取矩阵的行数 (m) 和列数 (n)
        int m = matrix.length;
        int n = matrix[0].length;

        // 从矩阵的右上角开始搜索
        int i = 0;      // 行索引,从第 0 行开始
        int j = n - 1;  // 列索引,从最后一列开始

        // 进行搜索,直到越界
        while (i < m && j >= 0) {
            // 如果当前元素等于目标值,返回 true
            if (matrix[i][j] == target) {
                return true;
            }

            // 如果当前元素小于目标值,向下移动 (增加行索引)
            if (matrix[i][j] < target) {
                i++;
            } 
            // 如果当前元素大于目标值,向左移动 (减少列索引)
            else {
                j--;
            }
        }

        // 遍历完都没找到目标值,返回 false
        return false;
    }
}

思路

给定一个 m × n 的二维矩阵,矩阵满足:

  • 每行的元素从左到右 单调递增

  • 每列的元素从上到下 单调递增

目标是在该矩阵中查找是否存在某个 target 值,并返回 truefalse

由于矩阵具有 行列单调递增 的特性,可以利用 从右上角开始查找 的策略:

  1. 初始化 位置:

    • 从矩阵的 右上角 ( matrix[0][n-1] ) 开始

    • 这个位置的值是当前行的最大值,当前列的最小值

  2. 查找策略

    • 如果当前元素等于 target,直接返回 true

    • 如果当前元素 小于 target,说明 target 可能在更 下面的行 ,向 下移动

    • 如果当前元素 大于 target,说明 target 可能在更 左侧的列 ,向 左移动

    • 这样每次移动都会缩小搜索范围,直到找到 target 或者超出边界

  3. 终止条件

    • 如果行索引 i 超出 m 或者列索引 j 变成负数,说明矩阵中不存在 target,返回 false

时间 & 空间复杂度分析

  • 时间复杂度 : O(m + n)

    • 最坏情况下,从右上角走到左下角,总共 m + n - 1
  • 空间复杂度 : O(1)

    • 只使用了常数级别的额外空间

总结:

  • 这种 "步步逼近" 的方法比直接 O(m*n) 遍历要快得多

  • 由于每次移动都会缩小搜索空间,效率很高

  • 适用于大规模 m, n 的情况下

相关推荐
圣保罗的大教堂19 小时前
leetcode 3433. 统计用户被提及情况 中等
leetcode
cike_y19 小时前
JavaWeb-Request应用与Cookie&[特殊字符]️Session
java·开发语言·安全·java安全
hashiqimiya19 小时前
两个步骤,打包war,tomcat使用war包
java·服务器·前端
大筒木老辈子19 小时前
C++笔记---并发支持库(atomic)
java·c++·笔记
Cricyta Sevina19 小时前
Java Collection 集合进阶知识笔记
java·笔记·python·collection集合
BD_Marathon20 小时前
【JavaWeb】Servlet_url-pattern的一些特殊写法问题
java·开发语言·servlet
黄俊懿20 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——开启全局事务
java·数据库·spring·spring cloud·微服务·架构·架构师
CoderYanger20 小时前
C.滑动窗口-求子数组个数-越长越合法——3325. 字符至少出现 K 次的子字符串 I
c语言·数据结构·算法·leetcode·职场和发展·哈希算法·散列表
零度@20 小时前
Java中Map的多种用法
java·前端·python
中文很快乐20 小时前
java开发--开发工具全面介绍--新手养成记
java·开发语言·java开发·开发工具介绍·idea开发工具