题目:一个二维数组中,每一行按照从左到右递增的顺序排列,每一列按照从上到下递增的顺序排列。
要求:完成一个函数,输入这样的数组和一个整数,判断数组中是否含有该整数。存在,返回 true,不存在返回 false。
思路:
一维递增数组中可以使用二分查找,每次都能将查找范围减小一半,题目中是二维数组,如果将每一行与每一列合并视为一个一维数组,则该数组为递增排列,使用二分查找,每次查找将范围减少一行或者一列,迭代之后,可以得到查找结果。
以下图所示数组为例,查找22,需要经过四次查找,前两次分别将查找范围减少一行,第三次减少一列,第四次时,查找到22,结束。
Java 实现:
public class Solution {
public boolean Find(int [][] array,int target) {
if (array == null || array.length == 0 || array[0].length == 0)
return false;
int rows = array.length;
int cols = array[0].length;
int i = 0, j = cols - 1;
while (i <= rows - 1 && j >= 0) {
int tmp = array[i][j]; // 从左下角开始查找
if (target == tmp) {
return true;
} else if (target > tmp) {
i++; // 删除 tmp 所在列
} else {
j--; // 删除 tmp 所在行
}
}
return false;
}
}