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.
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int row=matrix.size()-1; // rows number as it appears
int col=matrix[0].size(); // cols number. why not -1? because I'm gonna take %
int index=0; // pointer
while(target>matrix[index][index%col] & index!=row){//pointer goes along diagonals like zigzag if the #row is greater than #col
index++; // try to find the right row, stop condition: reaching the last row or meeting
} // the right row
if(target<matrix[index][0] & index!=0) // if the smallest unit of right row is still larger than target,
index--; // or not the 1st row, pointer goes back for 1 row
for(vector<int>::iterator iter=matrix[index].begin();iter!=matrix[index].end();++iter){// search the whole row for target
if(target==*iter) return true; // comes up with the target return true
}
return false; // ends up nothing return false
}
This can be faster than a direct search, for the reason that it actually search along diagonals. I guess it's something about the possibility.
There is another way, that we can treat this 2D matrix as a one dimension matrix, and always compare the target with the middle value.