劍指offer02_二維數組中的查找

二、二維數組中的查找

題目描述:java

在一個 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;
 }
}

複雜度分析code

  • 時間複雜度: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)。get

IDEA版本測試文件io

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);
 }
}
相關文章
相關標籤/搜索