美文网首页
04. 二维数组中的查找

04. 二维数组中的查找

作者: 水中的蓝天 | 来源:发表于2022-08-13 07:13 被阅读0次

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    示例:
    现有矩阵 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。
    给定 target = 20,返回 false。

    限制:
    0 <= n <= 1000
    0 <= m <= 1000

    思路:由于每行都是升序排列 那就从第0行的最后一列开始查找最为合适

    时间复杂度:O(n)
    空间复杂度:O(1)
    
    class Solution {
    
        public boolean findNumberIn2DArray(int[][] matrix, int target) {
    
            //0.处理边界问题 空数组、长度为0、列数为0 都属于数组中没有值
            if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
    
            //1.定义需要的数据结构
            boolean flag = false;
            //二维数组矩阵
            int row = matrix.length;//行数
            int column = matrix[0].length;//列数
            //第0行 最后一列开始遍历 即右侧顶角 这是因为每一行都是从左往右升序排列 这里用到二分查找的思想先拿中间值对比
            int i = 0,j = column - 1;
    
            //2.遍历寻找target是否在数组中
            while(i < row && j >= 0) {
                int value = matrix[i][j];
                if(target == value) {//找到了,记录下来跳出循环
                   flag = true;
                   break;
                }else if (target > value) {//要找的值比当前行最大值都大,去下一行
                   i++;
                }else {//要找的值当前行最大值小,去上一列
                   j--;
                }
            }
     
            //3.返回结果
            return flag;
    
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:04. 二维数组中的查找

          本文链接:https://www.haomeiwen.com/subject/mgxqgrtx.html