在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:给定一组二维数组数据:
[1,4,7]
[3,6,9]
[4,8,11]
数组的每一行从左往右依次增大。数组的每一列从上往下依次增大,求数组中是否存在目标数target。
解题思路:
该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,可以先从右上角开始查找,根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素。时间复杂度 O(M + N)。M是行,N是列。代码实现:
/**
* 经过row和line的初始化默认从右上角开始寻找,如果目标值大于右上角的值则往下寻找,小于则往左寻找
* @param arr 输入的数组
* @param target 目标值
* @return 是否找到
*/
public static boolean search(int[][] arr,int target){
//定义行,默认第一行
int row = 0;
//定义列,默认最后一列
int line = arr[row].length-1;
//定义是否找到标志位
boolean flag = false;
//如果行和列都未超过数组的界限,则一直寻找
while (row <= arr.length-1 && line >=0){
if(target == arr[row][line]){
flag = true;
break;
}else if(target < arr[row][line]){
//列数减一也就是左移
line--;
}else if(target > arr[row][line]){
//行数加一也就是下移
row++;
}
}
return flag;
}