2、二维数组中的查找

题目形容:

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

示例答案:

/**形式一:暴力如果不思考二维数组排好序的特点,则间接遍历整个二维数组的每一个元素判断目标值是否在二维数组中存在。*/class Solution {  public boolean findNumberIn2DArray(int[][] matrix, int target) {    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {         return false;    }    int rows = matrix.length, columns = matrix[0].length;    for (int i = 0; i < rows; i++) {      for (int j = 0; j < columns; j++) {         if (matrix[i][j] == target) {              return true;         }      }    }   return false; }}

复杂度剖析

  • 工夫复杂度:O(nm)。二维数组中的每个元素都被遍历,因而工夫复杂度为二维数组的大小。
  • 空间复杂度:O(1)。
/**形式二:线性从二维数组的右上角开始查找。如果以后元素等于目标值,则返回 true。如果以后元素大于目标值,则移到右边一列。如果以后元素小于目标值,则移到下边一行。*/class Solution {    public boolean findNumberIn2DArray(int[][] matrix, int target) {        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {          return false;        }        int rows = matrix.length, columns = matrix[0].length;        int row = 0, column = columns - 1;        while (row < rows && column >= 0) {          int num = matrix[row][column];          if (num == target) {             return true;          } else if (num > target) {            column--;          } else {            row++;          }        }    return false; }}

复杂度剖析

工夫复杂度:O(n+m)。拜访到的下标的行最多减少 n 次,列最多缩小 m 次,因而循环体最多执行 n + m 次。
空间复杂度:O(1)。

IDEA版本测试文件

package com.java.offer_75;public class findNumberIn2DArray_02 { /** * 若数组为空,返回 false * 初始化行下标为 0,列下标为二维数组的列数减 1 * 反复下列步骤,直到行下标或列下标超出边界 *     取得以后下标地位的元素 num *     如果 num 和 target 相等,返回 true *     如果 num 大于 target,列下标减 1 *     如果 num 小于 target,行下标加 1 * 循环体执行结束仍未找到元素等于 target ,阐明不存在这样的元素,返回 false` * @param matrix * @param target * @return */     public boolean findNumberIn2DArray(int[][] matrix, int target) {         if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {             return false;          }         int rows = matrix.length, columns = matrix[0].length;         int row = 0, column = columns - 1;         while (row < rows && column >= 0) {           int num = matrix[row][column];           if (num == target) {              return true;            } else if (num > target) {              column--;            } else {              row++;            }         }        return 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(matrix.length);  //行数     System.out.println(matrix[0].length);  //列数     findNumberIn2DArray_02 findNumberIn2DArray_02=new findNumberIn2DArray_02();     boolean numberIn2DArray = findNumberIn2DArray_02.findNumberIn2DArray(matrix, 5);     boolean numberIn2DArray2 = findNumberIn2DArray_02.findNumberIn2DArray(matrix, 20);     System.out.println("剑指offer第二题:二维数组中的查找n");     System.out.println("目标值是否找到:");     System.out.println(numberIn2DArray);     System.out.println(numberIn2DArray2); }}