在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
第一步:
找矩阵对角线上比target小的最大数A,那么A所在的正方形中所有数的值都比target小
第二步:
找到B点,它是第一列中比target大的第一个数
第三步:
找到C点,它是第一行中比target大的第一个数
那么就将范围缩小到了斜线所围成的部分,在其中找是否存在等于target的数,若存在返回true,否则返回false
对应java代码:
public class Solution {
public boolean Find(int target, int [][] array) {
//find the lowest boundary in the diagonal
boolean flag=false;
int tempdia=Math.min(array.length,array[0].length);
int low=-1;
for(int i=0;i<tempdia;i++){
if(array[i][i]<target){
low=i;
}else if(array[i][i]>target){
break;
}else{
flag=true;
return true;
}
}
//find the largest boundary include row and colm
int larow=-1;
int lacol=-1;
for(int i=low;low!=-1 && i<array.length;i++){
if(array[i][0]>target){
break;
}else if(array[i][0]==target){
flag=true;
return true;
}
larow=i;
}
for(int j=low;low!=-1 && j<array[0].length;j++){
if(array[0][j]>target){
break;
}else if(array[0][j]==target){
flag=true;
return true;
}
lacol=j;
}
for(int i=low;low!=-1 && i<=larow;i++){
for(int j=0;j<=lacol;j++){
if(array[i][j]==target){
flag=true;
return true;
}
}
}
for(int j=low;low!=-1 && j<=lacol;j++){
for(int i=0;low!=-1 && i<=larow;i++){
if(array[i][j]==target){
flag=true;
return true;
}
}
}
return flag;
}
}