【LeetCode 热题100】 240. 搜索二维矩阵 II的算法思路及python代码

news/2025/2/26 17:13:08

240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m × n m \times n m×n 矩阵 m a t r i x matrix matrix 中的一个目标值 t a r g e t target 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

在这里插入图片描述

解题思路:

算法采用深度优先搜索(DFS) 结合栈结构,从矩阵的中间位置开始搜索。利用矩阵行列递增的特性,根据当前元素与目标值的比较结果,向可能的方向扩展搜索。通过记录已访问的位置避免重复检查,直到找到目标值或遍历完所有可能路径。

算法步骤

初始化

获取矩阵的行数 m 和列数 n,选择中间位置 (m//2, n//2) 作为起点,压入栈中。

栈处理

循环处理栈中的位置,直到栈为空:

  • 弹出栈顶元素,检查是否越界,若越界则跳过。
  • 若当前元素等于目标值,返回 True。
  • 若当前元素大于目标值,将上方 (i-1, j) 和左方 (i, j-1) 压入栈。
  • 若当前元素小于目标值,将下方 (i+1, j) 和右方 (i, j+1) 压入栈。
  • 标记当前位置为已访问,避免重复处理。

终止条件

若栈空仍未找到目标值,返回 False。

python代码

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)
        n = len(matrix[0])
        i,j = m // 2, n // 2
        stack = [[i,j]]
        path_ij = []
        while len(stack) > 0:
            current_ij = stack.pop()
            i,j = current_ij[0], current_ij[1]
            if i < 0 or j < 0 or i >= m or j >= n:
                continue
            current_ele = matrix[i][j]
            if current_ele > target and current_ij not in path_ij:
                stack.append([i-1,j])
                stack.append([i,j-1])
            elif current_ele < target and current_ij not in path_ij:
                stack.append([i+1,j])
                stack.append([i,j+1])
            elif current_ele == target:
                return True
            path_ij.append(current_ij)
        return False

结果

在这里插入图片描述

复杂度分析

时间复杂度:
最坏情况下需遍历大部分矩阵元素。每次判断是否已访问的时间为 O ( k ) O(k) O(k)(k 为已访问节点数),整体最坏时间复杂度为 O ( m n ∗ ( m + n ) ) O(mn * (m+n)) O(mn(m+n)),效率较低。
空间复杂度:
栈和已访问列表最多存储 O ( m n ) O(mn) O(mn) 个元素,空间复杂度为 O ( m n ) O(mn) O(mn)

官方题解思想

基于矩阵行列递增的特性,从右上角开始逐步缩小搜索范围。通过比较当前元素与目标值的大小,动态调整搜索方向:

  • 若当前元素大于目标值,说明目标值不可能在当前元素的右侧列,因此向左移动一列。
  • 若当前元素小于目标值,说明目标值不可能在当前元素的上方行,因此向下移动一行。

通过这种“逐步排除”策略,快速逼近目标值,实现高效搜索。

算法步骤

  • 初始化起点:矩阵的右上角[0, n-1]开始搜索。
  • 循环搜索:
    • 若当前元素等于目标值,直接返回 True
    • 若当前元素大于目标值,向左移动一列 y -= 1
    • 若当前元素小于目标值,向下移动一行 x += 1
  • 终止条件: 当行或列索引越界时,说明目标值不存在,返回 False

python代码

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m, n = len(matrix), len(matrix[0])
        x, y = 0, n - 1
        while x < m and y >= 0:
            if matrix[x][y] == target:
                return True
            if matrix[x][y] > target:
                y -= 1
            else:
                x += 1
        return False

结果

在这里插入图片描述

复杂度分析:

  • 时间复杂度: O ( m + n ) O(m + n) O(m+n)
    最坏情况下从右上角移动到左下角,总移动次数不超过 m + n m + n m+n 次,例如从 ( 0 , n − 1 ) (0, n-1) (0,n1) 移动到 ( m − 1 , 0 ) (m-1, 0) (m1,0)
  • 空间复杂度: O ( 1 ) O(1) O(1)
    仅使用常数级别的额外空间(指针 x , y x, y x,y)。

http://www.niftyadmin.cn/n/5868971.html

相关文章

4*A100 部署 deepseek-r1-671B

部署deepseek-r1-671B 使用 4*A100 部署 deepseek-r1-671b-1.58bit 大模型。 环境 ubuntu22.04LTScuda 12.2.0 要求 内存&#xff1a; 256GB及以上显存&#xff1a; 256GB及以上&#xff08;160G可以跑起来&#xff0c;但对于长上下文容易oom&#xff09;&#xff0c;这里…

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…

Cramér-Rao界:参数估计精度的“理论底线”

Cramr-Rao界&#xff1a;参数估计精度的“理论底线” 在统计学中&#xff0c;当我们用数据估计一个模型的参数时&#xff0c;总希望估计结果尽可能精确。但精度有没有一个理论上的“底线”呢&#xff1f;答案是有的&#xff0c;这就是Cramr-Rao界&#xff08;Cramr-Rao Lower …

探秘分布式 IO 耦合器之高速背板总线

在工业自动化的复杂网络中&#xff0c;分布式 IO 耦合器扮演着关键角色&#xff0c;而其中的高速背板总线特性更是核心中的核心&#xff0c;如同一条信息高速公路&#xff0c;让数据传输高效又稳定。 传统的 IO 系统在数据交互时&#xff0c;常常面临数据拥堵、传输延迟等问题&…

Spring源码分析の循环依赖

文章目录 前言一、循环依赖问题二、循环依赖的解决三、整体流程分析 前言 常见的可能存在循环依赖的情况如下&#xff1a; 两个bean中互相持有对方作为自己的属性。   类似于&#xff1a; 两个bean中互相持有对方作为自己的属性&#xff0c;且在构造时就需要传入&#xff1a…

从两地三中心到多地多中心,OceanBase如何实现金融级高可用

“两地三中心”已成为金融领域基准的容灾部署模式。本文将简要阐述金融行业容灾架构中“两地三中心”的具体要求和部署&#xff0c;并进一步探讨OceanBase在实现“两地三中心”标准后&#xff0c;再至“多地多中心”部署中所展现的独特优势与特点。 商业银行的容灾要求 《商业…

智能语音机器人为电销行业带来一场革命性的变化

我们知道一个企业的发展离不开销售&#xff0c;因为它能直接带来盈利&#xff0c;所以很多企业极其重视电话销售这一模式。但随着人工智能技术的发展&#xff0c;许多企业都采用了智能语音机器人来替代人工&#xff0c;甚至替代了传统呼叫中心运/营模式&#xff0c;在极大提升企…

SQL SERVER日常运维巡检系列之-性能

前言 做好日常巡检是数据库管理和维护的重要步骤&#xff0c;而且需要对每次巡检日期、结果进行登记&#xff0c;同时可能需要出一份巡检报告。 本系列旨在解决一些常见的困扰&#xff1a; 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻烦生成报告困难&#xff0c;无…