题目:在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成一个函数,输入这样的二维数组和一个整数,判断数组中是否含有该整数。
思考:这个问题看似复杂,但是我们可以从一个具体的例子入手,找到解决问题的规律:
首先选取数组右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除该数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组查找范围中剔除一行或一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。或者也可以从数组的左下角开始查找过程,如果该数字等于要查找的数字,查找过程结束;如果该数字小于要查找的数字,则剔除该数字所在的列;如果该数字大于要查找的数字,则剔除该数字所在的行。
注意:不能选择左上角或者右下角,因为这样无法缩小查找范围。
解决方案:
//选取右上角数字
public boolean Find(int[][] arr, int target){
int rows = arr.length;
int columns = arr[0].length;
boolean found = false;
if( arr != null && rows > 0 && columns > 0){
int row = 0 , column = columns - 1;
while(row < rows && column >= 0){
if (arr[row][column] == target){
found = true;
break;
}
else if(arr[row][column] > target){
column --;
}
else
row ++;
}
}
return found;
}
//选取左下角数字
public boolean Find2(int[][] arr, int target){
int rows = arr.length;
int columns = arr[0].length;
boolean found = false;
if(arr != null && rows > 0 && columns > 0){
int row = rows - 1, column = 0;
while(row >= 0 && column < columns){
if(arr[row][column] == target){
found = true;
break;
}
else if(arr[row][column] < target){
column ++;
}
else
row --;
}
}
return found;
}