剑指offer04二维数组中的查找

113 阅读1分钟

🍀二维数组中的查找

描述:

 # 在一个 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

思考:

题目中给的是行列都递增的二维数组,要求查找一个数是否存在在 数组中,要求尽可能的高效,我刚开始想的是既然行列都是递增,那么从二维数组的对角线开始找到大于target的数字然后再从它的前一个数开始往右往下查找知道找到返回数字,或者找不到返回false,但是感觉这样写太过于繁琐了,还得考虑二维数组行列那个大,不然会造成下标溢出,但是下面这个算法就很简单,利用这个数组的性质,一位一位的找到target。

实现:

 class Solution {
     public boolean findNumberIn2DArray(int[][] matrix, int target) {
         if(matrix == null || matrix.length == 0) {
             return false;
         }
         int m = matrix.length, n = matrix[0].length;
         int row = 0, col = n - 1;
         while(row < m && col >= 0) {
             if(matrix[row][col] > target) {
                 col--;
             }else if(matrix[row][col] < target) {
                 row++;
             }else {
                 return true;
             }
         }
         return false;
     }
 }

测试一下!

image.png \