天天看点

Java完成剑指OFFER感悟

题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

我的代码:

int x=array.length;
		int biaozhi=0;
		if(target<array[0][0]||target>array[x-1][x-1]) {
			return false;
		}
		for(int i=0;i<x;i++) {
			if(target<=array[i][x-1]) {
				if(target==array[i][x-1]) {
                    biaozhi=1;
					 break;}
				for(int j=0;j<x;j++) {
					if(target==array[i][j]) {
                        biaozhi=1;
						break;
					}
				}
			
			}
		}
		if(biaozhi==0) {
			return false;
		}
        else return true;
	}
           

思路:查找右上角的数字,由于数组是顺序排列的,每一行最右边的数字是每行最大的,通过比较,知道目标数字在哪一行,循环次数最少。

结果:未通过[[]]空数组的测试,和7,[[1,2,8,9],[4,7,10,13]]测试

原因分析:使用for循环出现空数组异常,是因为在for循环里面没有用到关于数组的判断。未通过7,[[1,2,8,9],[4,7,10,13]]异常是因为超过数组长度,array.length得到行数,array[0][]得到列数。

正确的代码:

int j=0;
        int i=array.length-1;
        while(i>=0&&j<=array[0].length-1)
        {
            if(target==array[i][j]){
                return true;
            }
            else if(target>array[i][j]){
                j++;
            }
            else{
                i--;
            }
            
         }
        return false;