题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解法:选择从右下角往上检索
public class Solution {
public boolean Find(int [][] array,int target) {
if(array==null||array.length==0||array[0].length==0){
return false;
}
int row = array.length;
int column = array[0].length;
return findAll(array,target,row,column);
}
public boolean findAll(int [][] array,int target,int row,int column){
if(row-1<0||column-1<0){
return false;
}
if(target<array[0][0]||target>array[row-1][column-1]){
return false;
}
if(target==array[0][0]||target==array[row-1][column-1]){
return true;
}
for(int i=column-1;i>=0;i--){
if(array[row-1][i]==target){
return true;
}
if(array[row-1][0]>target){
row--;
return findAll(array,target,row,column);
}
if(array[row-1][i]<target){
row--;
return findAll(array,target,row,column);
}
}
return false;
}
}
看了一下网友解法,从右下角开始往上往左都是小于该数,所以应该选择左下角比较好,小于是往上,大于往右,这样不会出现岔路,参考如下:
public class Solution {
public boolean Find(int [][] array,int target) {
int len = array.length-1;
int i = 0;
while((len >= 0)&& (i < array[0].length)){
if(array[len][i] > target){
len--;
}else if(array[len][i] < target){
i++;
}else{
return true;
}
}
return false;
}
}