在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二维数组的行数:array.length;
二维数组的列数:array[0].length;
两种思路:
思路一:把每一行看成一个有序的递增数组,对每一行进行二分查找。
注:
二分查找:二分查找是一个基础的算法。二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。
算法要求:必须采用按照关键字进行顺序存储。
public class BinarySearch {
public boolean Find(int [][] array,int target) {
for(int i=0;i<array.length;i++){
int low=0;
int high=array[i].length-1;
while(low<=high){
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;
}
}
另外一个思路是:
利用题目中二维数组的性质:
由上到下,由左到右递增的规律,选取右上角或者左下角的元素array[0][col-1]或array[row-1][0],
右上角时:当target小于array[row][col]时,那么target必定在该行,且在该元素的左边,col--;
当target大于array[row][col]时,那么target元素在该行下面的某行中,row++.
public boolean Find(int target,int[][] array){
int row = 0;
int col = array[0].length-1;
while(row < array.length && col >=0){
if(target == array[row][col]){
return true;
}else if(target > array[row][col]){
row++;
}else{
col--;
}
}
return false;
}
左下角时:当target 大于array[row][col]时,那么target必定在该行,且在该元素的右边,col++;
当target小于arry[row][col]时,那么target在该行的上面,row--;
实现思路与上同,程序略。