题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
比如这样的二维数组:
{
{1, 2, 8, 9},
{2, 4, 9, 12},
{4, 7, 10, 13},
{6, 8, 11, 15}
}
然后判断是否存在某一个数。
思路
考察数组的特性,我们如果从右上角的元素开始找,比如我们要找4,比9小,那么直接删除列即可,因为这个列上的元素看到都大于9;那么我们这时锁定8,发现还是比他小,再删除一列;这时变成了2,发现4比他大,则删除行;这个是后就锁定了4,就是我们想要的答案。
规律:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;
如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行。
也就是说如果要查找的数字不在数组的右上角,则每-次都在数组的查找范围中剔除)行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。
程序
public class Test02 {
/**
* @Author 【swg】.
* @Date 2018/3/7 19:50
* @param arr 待查找的数组
* @param number 要查找的数
* @return 查找结果,true找到,false没有找到
*/
public static boolean find(int[][] arr,int number){
if(arr == null || arr.length < 1 || arr[0].length < 1){
return false;
}
//统计行数和列数
int rows = arr.length;
int cols = arr[0].length;
//初始位置为第一行最后一列
int row = 0,col = cols-1;
while(row >=0 && col >=0 && row < rows && col <cols){
if(arr[row][col] == number){
return true;//相等则直接返回
}else if(arr[row][col] > number){
col--;//数组中的这个数比number大,则删除这个列
}else {
row++;//数组中的这个数比number小,则删除这个行
}
}
return false;
}
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 8, 9},
{2, 4, 9, 12},
{4, 7, 10, 13},
{6, 8, 11, 15}
};
System.out.println(find(matrix, 7)); // 要查找的数在数组中
System.out.println(find(matrix, 5)); // 要查找的数不在数组中
System.out.println(find(matrix, 1)); // 要查找的数是数组中最小的数字
System.out.println(find(matrix, 15)); // 要查找的数是数组中最大的数字
System.out.println(find(matrix, 0)); // 要查找的数比数组中最小的数字还小
System.out.println(find(matrix, 16)); // 要查找的数比数组中最大的数字还大
System.out.println(find(null, 16)); // 健壮性测试,输入空指针
}
}
运行结果:
true
false
true
true
false
false
false