剑指offer01-二维数组中的查找

1,012 阅读2分钟

二维数组中的查找

题目描述

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

思路

  • 首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。(也可以从左下开始)

程序(java)

    /**
     * code1
     * 时间复杂度:O(mn),空间复杂度:O(1)
     */
public class Solution {
    public boolean Find(int target, int [][] array) {
        if((array==null||array.length==0)||(array.length==1&&array[0].length==0)){return false;}//判断是否为空
        int i=0;
        int j=array[0].length-1;
        if(target==array[array.length-1][0]||target==array[array.length-1][j]){return true;}//判断左下角与右下角元素是否为目标数
        while(target!=array[i][j]){
            if(i==array.length-1||j==0){return false;}
            if(target<array[i][j]){j--;}else{i++;}
        }
        return true;
    }
    /**
     * code2
     * 时间复杂度:O(mn),空间复杂度:O(1)
     */
public class Solution {
    public boolean Find(int target, int [][] array) {
        if (array == null || array.length == 0) {return false;}
        int row = 0;
        int column = array[0].length - 1;

        while (row < array.length && column >= 0) {
            if (array[row][column] == target) {return true;}
            if (array[row][column] > target) {column--;} else {row++;}
        }
        return false;
    }

补充:

java中判断二维数组为空,以int类型为例,三种情况:

  1. 二维数组首地址是否为空,即array=null;
  2. 二维数组是否为{},即array.length=0的情况;
  3. 二维数组是否为{{}},即array.length=1&&array[0].length=0的情况;(array.length为行数,array[0].length为列数)
注意: 如果两者在一行代码中,就要先判断数组是否为空再判断数组长度是否为0,否者有可能会报空指针异常;eg:if(array == null || array.length ==0)这样写是没有任何问题的,因为java中||运算符具有短路原则,如果一个数组为空,整个表达式为true,后面的就不会执行,如果数组不为空,在判断数组长度是否为0,这样就不会报空指针异常。当然,如果把 || 符改为 | 就会抛出异常,因为 | 运算符不具有短路原则。反过来,如果写成这样 if(array.length == 0 || array == null)在array == null 为true 的情况下就会报空指针异常(运行时异常);
  • 综上所述,Java中判断二维数组为空的条件为:
if((array==null||array.length==0)||(array.length==1&&array[0].length==0))