二维数组中的查找
题目描述
| 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 |
思路
- 首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。(也可以从左下开始)
程序(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类型为例,三种情况:
- 二维数组首地址是否为空,即array=null;
- 二维数组是否为{},即array.length=0的情况;
- 二维数组是否为{{}},即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 的情况下就会报空指针异常(运行时异常); |
if((array==null||array.length==0)||(array.length==1&&array[0].length==0))