剑指offer面试题4:二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左向右递增,每一列从上到下递增的顺序排列。输入一个这样的二维数组和一个整数,并判断数组中是否含有该整数。
例如:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
如果查找的数字是7,则返回true;
思路:
首先选取数组中右上角的数字,如果该数字正好等于要查找的数字,则查找结束;如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除这个数字所在的行。这样每次剔除一行或者一列,逐渐缩小查找的范围,直到找到要查找的数字,或者查找范围为空。
代码如下:
public static boolean findNumber(int[][] arr,int target){
if(arr==null) return false;
int rows=arr.length;
int columns=arr[0].length;
if(rows>0&&column>0){
int row=0;
int column=columns-1;
while(row<rows&&column>=0){//注意循环退出条件
if(arr[row][column]==target){//正好找到这个数字
return true;
break;
}else if(arr[row][column]>target){//该数字大于要找的数字,剔除这个数字所在的列
column--;
}else{//该数字小于要找的数字,剔除这个数字所在的行
row++;
}
}
}
return false;
}
时间复杂度:O(n).