在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。算法
首先分析該數組的特色,在向下和向右方向上,數值會遞增。以二維數組中任意位置元素爲例,同行右側元素皆大於該點,同列下側元素皆大於該點,所以該點右下側元素皆大於該點。數組
而右上側和左下側點均可能有大於該點的點,初步可認爲,大於該值的點位於右側和下側。
所以,咱們能夠根據該數組的特色進行逐行剔除,達到縮小範圍,查找目標值的目的。函數
首先肯定初始點,因爲剔除某行/列,須要與目標值對比。初始點大於目標值,須要往小側移動;初始點小於目標值,須要往大側移動。而四個頂點,只有左下角和右下角,進行橫向和縱向移動能高效篩選和剔除行列。spa
選擇右上角爲初始點,執行下述操做
1)若是該點等於目標值,結束查找
2)若是該點小於目標值,往大側移動,下移一行(列索引不變)
3)若是該點大於目標值,往小側移動,左移一列(行索引不變)
重複上述過程,直到索引超過數組邊界。若是符合1,退出重複。這裏,咱們認爲本題找到目標值便可,無需查找是否有其餘位置的目標值。code
根據上述思路,經過向左下移動,達到整行或者整列的剔除,實現比較快速的查找。能夠把這個過程理解爲剝洋蔥,一層層剝開外層的非目標層,查找內部的目標值。blog
源程序:排序
package jz_offer; public class problem03 { /** * -查找二維數據arr中是否存在數值num * @param arr:二維數組 * num:目標值 * @return 在二維數組中是否找到了目標值num,返回類型boolean */ public static boolean findNum(int[][] arr,int num){ boolean flag=false; //標誌位,爲true時表示找到目標值 int i=0; int j=arr[0].length-1; while(flag!=true&&i<arr.length&&j>=0){ if(arr[i][j]==num){ flag = true; break; }else if(arr[i][j]<num){ i++; }else{ j--; } } return flag; } public static void main(String[] args){ int[][] array={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; boolean found=findNum(array,7); System.out.println("if the num 7 is in the array?"+found); } }