在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路:二分查找

public class test {
public static boolean Find(int target, int[][] array) {
if(array == null || array.length == 0||(array.length==1&&array[0].length==0)){ //判断二维数组是否为空
return false;
}
for (int i = 0; i < array.length; i++) {
int max1 = array[i].length - 1;
int min1 = 0;
int mid1 = (min1 + max1) / 2;
while (array[i][mid1] != target) { //前面若不判断数组为空的条件,则会出现max为-1的情况,mid会为负数,则会抛出数组越界的异常。
if (target > array[i][mid1]) {
min1 = mid1 + 1;
} else if (target < array[i][mid1]) {
max1 = mid1 - 1;
}
if (max1 < min1) {
break;//二维数组的每一行元素,当max<min时表示没有查找到目标值,则跳出while循环
}
mid1 = (min1 + max1) / 2;
}
if(array[i][mid1] == target) { //若在某一行查找到目标值,则返回true
return true;
}else{
continue; //所查找行不存在目标值,则跳出for循环的本次循环
}
}
return false; //当for循环遍历完成,没有找到目标值,则会运行该步。
}


public static void main(String[] args){
int target = 11;
int[][] array = {{}};
boolean flag = Find(target,array);
System.out.println("flag:"+flag);
}
}

牛客网讨论区推荐解法:
for (int i = 0; i < array.length; i++) {
int low = 0;
int high = array[i].length - 1;
while (low <= high) { //条件为low<high时,当数组为空时,high为-1,low为0,该条件不满足,所以不必在前面考虑数组为空的情况。
int mid = (low + high) / 2;
if (target > array[i][mid])
low = mid + 1;
else if (target < array[i][mid])
high = mid - 1;
else
return true;
}
}
return false;
posted on 2018-06-08 14:59  大杰杰  阅读(80)  评论(0编辑  收藏  举报