解题思路:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。
public class Solution {
/**
* 在一个二维数组中查找一个数,该二维数组满足行从小到大,列从小到大
*
* @param target
* 待查找的数
* @param array
* 有规律的二维数组
* @return
*/
public boolean Find(int target, int[][] array) {
if (array == null || array.length == 0) {
return false;
}
// 保存数组的初始行数和列数
int rowNum = array.length;
int colNum = array[0].length;
// 保存当前数组的最右上角元素的索引
int row = 0;
int col = colNum - 1;
boolean result = false;;
while (row < rowNum && col >= 0) {
// 当待查找元素和数组的右上角元素相等时,查找成功
if (target == array[row][col]) {
result = true;
break;
} else if (target > array[row][col]) {
// 当待查找元素大于数组右上角的元素时
// 依据数组的规律,可以去除当前右上角元素所在的行,因为当前行的最大值都比待查找元素小
// 因此不可能出现在这一行,因此行号+1,列号不变
row++;
} else {
// 当待查找元素小于数组右上角的元素时
// 依据数组的规律,可以去除当前右上角元素所在的列,因为当前列的最小值都比待查找元素大
// 因此不可能出现在这一列,因此列号-1,行号不变
col--;
}
}
return result;
}