Write an efficient algorithm that searches for a value inMXNMatrix. 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]]
GivenTarget= 3, return true.
Idea: think of the matrix as an ordered array with row priority, and use binary search directly.
1 class Solution { 2 public: 3 bool searchMatrix( vector<vector<int>> &matrix, int target ) { 4 if( matrix.empty() ) { return false; } 5 int rows = matrix.size(), cols = matrix[0].size(); 6 int start = 0, end = rows*cols-1; 7 while( start <= end ) { 8 int middle = ( start + end ) / 2; 9 if( matrix[middle/cols][middle%cols] < target ) {10 start = middle + 1;11 } else if( matrix[middle/cols][middle%cols] > target ) {12 end = middle - 1;13 } else {14 return true;15 }16 }17 return false;18 }19 };
Compare the elements in the upper-right corner of the selected matrix with the target. If Matrix [0] [Cols-1] <target, column Cols-1 can be excluded; if Matrix [0] [Cols-1]> Target, 0th rows can be excluded.
1 class Solution { 2 public: 3 bool searchMatrix( vector<vector<int>> &matrix, int target ) { 4 if( matrix.empty() ) { return false; } 5 int rows = matrix.size(), cols = matrix[0].size(); 6 int i = 0, j = cols - 1; 7 while( i < rows && j >= 0 ) { 8 if( matrix[i][j] == target ) { return true; } 9 if( matrix[i][j] < target ) {10 ++i;11 } else {12 --j;13 }14 }15 return false;16 }17 };
Search a 2D matrix