題目連接:https://leetcode.com/problems/search-a-2d-matrix/description/數組
題目大意:一個矩陣,從左到右有序排列(未給升序或降序),從上到下,從小到大排列。給出一個target值,在這個矩陣中找找是否有該值,若是有返回true,不然返回false。ide
解法一:將target與每層的最後一個數值進行比較,找到該target所在的行,而後再在當前行進行二分查找。注意開始要排除矩陣爲[],[[]]的特殊狀況,不然會致使數組越界。代碼以下(耗時12ms):spa
1 public boolean searchMatrix(int[][] matrix, int target) { 2 //處理特殊狀況 3 if(matrix == null || matrix.length == 0 || matrix[0].length == 0) { 4 return false; 5 } 6 int pos = 0; 7 int length = matrix[0].length; 8 //找到所在行 9 for(int i = 0; i < matrix.length; i++) { 10 if(target <= matrix[i][length - 1]) { 11 pos = i; 12 break; 13 } 14 } 15 //在當前行中進行二分查找 16 int low = 0, high = length - 1; 17 while(low <= high) { 18 int mid = (low + high) / 2; 19 if(matrix[pos][mid] < target) { 20 low = mid + 1; 21 } 22 else if(matrix[pos][mid] > target) { 23 high = mid - 1; 24 } 25 else { 26 return true; 27 } 28 } 29 return false; 30 }
解法二(借鑑):在討論區找最優解,發現沒有很優的,這裏借鑑一個不一樣的解法吧,沒有定位某一行,而是將矩陣當成一個序列直接進行的二分查找,只是在定位中間數的時候仍是利用了矩陣二維數組定位的。並無快多少,可是代碼短不少。代碼以下(耗時13ms):code
1 public boolean searchMatrix(int[][] matrix, int target) { 2 if(matrix == null || matrix.length == 0 || matrix[0].length == 0) { 3 return false; 4 } 5 int cols = matrix[0].length; 6 //high指向的是矩陣的最後一個數值,而不是某一行的最後一個數值 7 int low = 0, high = matrix.length * cols - 1; 8 while(low <= high) { 9 int mid = (low + high) / 2; 10 //對於整個序列的中間下標,找到矩陣中的中間下標的值 11 if(matrix[mid / cols][mid % cols] < target) { 12 low = mid + 1; 13 } 14 else if(matrix[mid / cols][mid % cols] > target) { 15 high = mid - 1; 16 } 17 else { 18 return true; 19 } 20 } 21 return false; 22 }
解法三:作了240題,回頭利用240的解法三ac了這題。代碼徹底相同(耗時11ms)。【這個題略有問題,其實默認條件仍是跟240同樣的】blog