每日一题——搜索二维矩阵

搜索二维矩阵

一、题目背景

在LeetCode上,有一道经典的二维矩阵搜索问题------"搜索二维矩阵 II"。题目要求在一个具有特定性质的二维矩阵中查找目标值。矩阵的每一行从左到右升序排列,每一列从上到下升序排列。我们需要设计一个高效的算法来判断目标值是否存在于矩阵中。

二、题目描述

给定一个二维矩阵matrix和一个目标值target,矩阵的行数为m,列数为n。矩阵满足以下性质:

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

我们需要判断目标值target是否存在于矩阵中。

示例 1:

输入:

plaintext 复制代码
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:

输入:

plaintext 复制代码
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 <= m, n <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每一行的所有元素从左到右升序排列
  • 每一列的所有元素从上到下升序排列
  • -10^9 <= target <= 10^9

三、解题思路分析

1. 错误思路回顾

在解题过程中,我们可能会尝试一些直观的思路,但这些方法往往效率低下或存在逻辑错误。例如,从矩阵的左上角开始逐行逐列搜索,或者在矩阵中随机选择一个起点进行搜索。这些方法的时间复杂度较高,无法满足题目对效率的要求。

2. Z字形查找算法

经过分析,我们发现一种高效的搜索方法------Z字形查找。这种方法利用了矩阵的有序性,从矩阵的右上角(或左下角)开始搜索,通过逐步调整搜索范围,快速定位目标值。

算法步骤:
  1. 初始化 :从矩阵的右上角开始搜索,设当前坐标为(x, y),其中x = 0y = n - 1
  2. 搜索过程
    • 如果matrix[x][y] == target,说明找到了目标值,返回true
    • 如果matrix[x][y] > target,由于每一列是升序排列的,当前列的所有元素都大于目标值,因此将y减1,即向左移动。
    • 如果matrix[x][y] < target,由于每一行是升序排列的,当前行的所有元素都小于目标值,因此将x加1,即向下移动。
  3. 边界条件 :如果搜索过程中超出矩阵的边界(x >= my < 0),说明目标值不存在,返回false

3. 算法优势

Z字形查找算法充分利用了矩阵的有序性,避免了不必要的搜索。其时间复杂度为O(m + n) ,其中m是矩阵的行数,n是矩阵的列数。相比暴力搜索(时间复杂度为O(m * n)),这种方法效率显著提高。

四、代码实现

以下是基于Z字形查找算法的C语言实现:

c 复制代码
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
    int m = matrixSize;       // 矩阵的行数
    int n = *matrixColSize;   // 矩阵的列数
    int x = 0, y = n - 1;     // 从右上角开始搜索

    while (x < m && y >= 0) { // 确保搜索范围在矩阵内
        if (matrix[x][y] == target) { // 找到目标值
            return true;
        } else if (matrix[x][y] > target) { // 当前值大于目标值,向左移动
            y--;
        } else { // 当前值小于目标值,向下移动
            x++;
        }
    }

    return false; // 超出矩阵边界,目标值不存在
}

代码说明:

  1. 初始化x为0,y为矩阵的列数减1,即从右上角开始。
  2. 循环条件x < my >= 0,确保搜索范围在矩阵内。
  3. 搜索逻辑
    • 如果当前值等于目标值,直接返回true
    • 如果当前值大于目标值,向左移动(y--)。
    • 如果当前值小于目标值,向下移动(x++)。
  4. 返回结果 :如果超出矩阵边界仍未找到目标值,返回false

五、测试用例

测试用例 1:

plaintext 复制代码
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:

plaintext 复制代码
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

测试用例 3:

plaintext 复制代码
matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]
target = 7

输出true

六、总结

通过Z字形查找算法,我们能够高效地解决"搜索二维矩阵 II"问题。这种方法充分利用了矩阵的有序性,避免了暴力搜索的低效性。在实际应用中,我们还可以根据矩阵的性质选择其他优化策略,例如从左下角开始搜索,逻辑与从右上角类似。

这题本质上就是从右上角往右下角遍历,还是比较容易的。

相关推荐
z小猫不吃鱼25 分钟前
模型剪枝经典论文精读:Channel Pruning for Accelerating Very Deep Neural Networks
算法·机器学习·剪枝
njsgcs41 分钟前
已知链中心距用节数算中间电机摆放位置 常量弧长 三链轮弦长模型算法
算法
2601_962440841 小时前
计算机毕业设计之jsp旅游网站管理系统
java·开发语言·算法·课程设计·旅游·推荐算法
池塘的蜗牛2 小时前
AFDM波形基于DFT的通感一体化
算法
147API2 小时前
Claude global workspace 研究给智能体测试提了一个醒
人工智能·算法·机器学习
葫三生2 小时前
《论三生原理》与模糊数学的关联、异同、互补关系?
人工智能·科技·算法·机器学习·开源
我命由我123453 小时前
方差(实例实操、与标准差的区别)
java·数据结构·算法·数据分析·java-ee·intellij-idea·idea
闲研随记3 小时前
【文献阅读 ICML 2026】RL算法:Critique-GRPO
论文阅读·算法·llm·强化学习·rl·icml·grpo
民乐团扒谱机3 小时前
【微实验】从迷雾中看清世界:卡尔曼滤波的数学诗意与MATLAB实践
人工智能·算法·matlab·卡尔曼滤波·kalman
努力努力再努力wz3 小时前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http