剑指offer第二版——面试题4(java)

面试题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]会无法找到需要多次查询的数字

② 没加边界判断

猜你喜欢

转载自blog.csdn.net/qq_22527013/article/details/88314162