天天看點

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;