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
.
Analyse: binary search.
Runtime: 12ms.
1 class Solution { 2 public: 3 bool searchMatrix(vector<vector<int>>& matrix, int target) { 4 if(matrix.empty() || matrix[0].empty()) return false; 5 6 int m = matrix.size(), n = matrix[0].size(); 7 // target the row, low would be the target 8 int low = 0, high = m - 1; 9 while(low < high) { 10 int mid = low + (high - low) / 2; 11 if(matrix[mid][n - 1] > target) high = mid; 12 else if(matrix[mid][n - 1] < target) low = mid + 1; 13 else return true; 14 } 15 16 // target the column 17 int start = 0, end = n - 1; 18 while(start < end) { 19 int mid = start + (end - start) / 2; 20 if(matrix[low][mid] > target) end = mid; 21 else if(matrix[low][mid] < target) start = mid + 1; 22 else return true; 23 } 24 return matrix[low][start] == target; 25 } 26 };