题目:
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
Given target = 3
, return true
.
解题思路:利用两次二分查找法。因为所给矩阵第一列也是升序排列的,所以可以先对第一列进行二分查找,锁定该元素所在行数,然后再对列进行二分查找,即可判断target是否存在。这个的算法时间复杂度是O(log(rows)+log(columns))。
代码:
1 /** 2 * 本代码由九章算法编辑提供。没有版权欢迎转发。 3 * - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。 4 * - 现有的面试培训课程包括:九章算法班,系统设计班,BAT国内班 5 * - 更多详情请见官方网站:http://www.jiuzhang.com/ 6 */ 7 8 // Binary Search Twice 9 public class Solution { 10 public boolean searchMatrix(int[][] matrix, int target) { 11 if (matrix == null || matrix.length == 0) { 12 return false; 13 } 14 if (matrix[0] == null || matrix[0].length == 0) { 15 return false; 16 } 17 18 int row = matrix.length; 19 int column = matrix[0].length; 20 21 // find the row index, the last number <= target 22 int start = 0, end = row - 1; 23 while (start + 1 < end) { 24 int mid = start + (end - start) / 2; 25 if (matrix[mid][0] == target) { 26 return true; 27 } else if (matrix[mid][0] < target) { 28 start = mid; 29 } else { 30 end = mid; 31 } 32 } 33 if (matrix[end][0] <= target) { 34 row = end; 35 } else if (matrix[start][0] <= target) { 36 row = start; 37 } else { 38 return false; 39 } 40 41 // find the column index, the number equal to target 42 start = 0; 43 end = column - 1; 44 while (start + 1 < end) { 45 int mid = start + (end - start) / 2; 46 if (matrix[row][mid] == target) { 47 return true; 48 } else if (matrix[row][mid] < target) { 49 start = mid; 50 } else { 51 end = mid; 52 } 53 } 54 if (matrix[row][start] == target) { 55 return true; 56 } else if (matrix[row][end] == target) { 57 return true; 58 } 59 return false; 60 } 61 } 62 63 // Binary Search Once 64 public class Solution { 65 public boolean searchMatrix(int[][] matrix, int target) { 66 if (matrix == null || matrix.length == 0) { 67 return false; 68 } 69 if (matrix[0] == null || matrix[0].length == 0) { 70 return false; 71 } 72 73 int row = matrix.length, column = matrix[0].length; 74 int start = 0, end = row * column - 1; 75 76 while (start + 1 < end) { 77 int mid = start + (end - start) / 2; 78 int number = matrix[mid / column][mid % column]; 79 if (number == target) { 80 return true; 81 } else if (number < target) { 82 start = mid; 83 } else { 84 end = mid; 85 } 86 } 87 88 if (matrix[start / column][start % column] == target) { 89 return true; 90 } else if (matrix[end / column][end % column] == target) { 91 return true; 92 } 93 94 return false; 95 } 96 }