74.Search a 2D Matrix

題目連接: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     }
View Code

解法二(借鑑):在討論區找最優解,發現沒有很優的,這裏借鑑一個不一樣的解法吧,沒有定位某一行,而是將矩陣當成一個序列直接進行的二分查找,只是在定位中間數的時候仍是利用了矩陣二維數組定位的。並無快多少,可是代碼短不少。代碼以下(耗時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     }
View Code

 解法三:作了240題,回頭利用240的解法三ac了這題。代碼徹底相同(耗時11ms)。【這個題略有問題,其實默認條件仍是跟240同樣的】blog

相關文章
相關標籤/搜索