leetcode刷题(剑指offer) 240.搜索二维矩阵Ⅱ

240.搜索二维矩阵Ⅱ

编写一个高效的算法来搜索 *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

解法

仔细观察上图可以发现,从右上角出发,每次往左一格都是更小的数值,每次往下一格都是更大的数值,且从右上角的位置,以往左和往下这两个方向可以抵达二维数组的任何一格。

可能直接从上图的矩阵上来看不容易理解,那么把这个图翻转45°变成下图所示呢。

再加入箭头。。。。。

是不是有点二叉排序树的感觉了。15就是根节点,搜索的次数最多就为这颗树的深度。

从15这个位置开始,如果目标数比15更大就向右,比15更小就向左,以此迭代,最后可以找到目标数,如果遍历到不能再向下遍历了,那就是矩阵中不存在目标数。

方法的时间复杂度为O(N), 空间复杂度为O(1)。

代码如下

java 复制代码
/**
 * @author bwzfy
 * @ClassName _240搜索二维矩阵
 * @create 2024/1/23 - 17:40
 * @Version 1.0
 **/
public class _240搜索二维矩阵Ⅱ {

    private static boolean res = false;

    public static void main(String[] args) {
        int[][] matrix = new int[][]{
                {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}
        };
        System.out.println(searchMatrix(matrix, 12));
    }

    public static boolean searchMatrix(int[][] matrix, int target) {
        if (matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        int row = 0;
        int col = matrix[0].length - 1;
        while (row < matrix.length && col >= 0) {
            int value = matrix[row][col];
            if (target > value) {
                row++;
            } else if (target < value) {
                col--;
            } else {
              return true;
            }
        }
        return false;
    }

}
相关推荐
m0_686041613 分钟前
C++中的适配器模式变体
开发语言·c++·算法
txzrxz3 分钟前
结构体排序,双指针,单调栈
数据结构·算法·双指针算法·单调栈·结构体排序
AndrewHZ7 分钟前
【AI黑话日日新】什么是AI智能体?
人工智能·算法·语言模型·大模型·llm·ai智能体
wWYy.8 分钟前
算法:二叉树最大路径和
数据结构·算法
葱明撅腚10 分钟前
利用Python挖掘城市数据
python·算法·gis·聚类
We་ct12 分钟前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表
weixin_3954489124 分钟前
main.c_cursor_0129
前端·网络·算法
CS创新实验室36 分钟前
《计算机网络》深入学:路由算法与路径选择
网络·计算机网络·算法
一条大祥脚37 分钟前
ABC357 基环树dp|懒标记线段树
数据结构·算法·图论
tod11337 分钟前
力扣高频 SQL 50 题阶段总结(四)
开发语言·数据库·sql·算法·leetcode