面试题4:二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法:从右上角开始比较,若是[0,m]小于x,则往左移(因为第一排是每一列的最小值,若小于最小值,则该列中的所有数都大于x);若找到一个[0,m]小于x,则往下移(因为从上到下是从小到大,往下寻找更大的数字,直到找到和x一样大的数字——显示位置,返回1;或找到比x大的数字——返回0)
class Q4 {
public static void main(String[] args) {
int[][] L = new int[][]{{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
int x = 13;
int result = findN(L, x);
System.out.println(result);
}
public static int findN(int[][] L,int x) {
if(L.length==0 || L[0].length==0) {
return -1;
}
int n = 0;
int m = L[0].length-1;
int flag = 1;
while(n<=L.length-1 && m>=0 && flag==1) {
int orin = n;
int orim = m;
while(n<=L.length && m>=0 && x<L[n][m]) {
m--;
}
while(n<=L.length-1 && m>=0 && x>L[n][m]) {
n++;
}
if(orin==n&& orim==m && n<=L.length && m>=0) {
if(L[n][m]==x) {
System.out.printf("answer:n-%d m-%d\n", n,m);
return 1;
}else {
return -1;
}
}else if(n>L.length-1 || m<0) {
return -1; //越界
}else if(orin!=n || orim!=m){
flag = 1; // 本次循环后位置还有改变
}
}
return -1;
}
}
出现过错误的地方:
① eg:当要查找6时,需要9→8→2,然后2→4→7 如果循环中没加判断,直接用当前n、m来判断L[n,m]会无法找到需要多次查询的数字
② 没加边界判断