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.
Example 1: Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 Output: true
Example 2: Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 Output: false
code
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty()||matrix.at(0).empty()||target<matrix.at(0).at(0)||target>matrix.at(matrix.size()-1).at(matrix.at(0).size()-1)) return false; int low=0,height=matrix.size()-1; int mid=0; while(low<=height) { mid=(low+height)/2; if(target>=matrix.at(mid).at(0)) { if(mid==matrix.size()-1||(mid<matrix.size()-1&&target<matrix.at(mid+1).at(0))) break; } if(target<matrix.at(mid).at(0)) height=mid-1; else if(target>matrix.at(mid).at(0)) low=mid+1; } int pos=mid; low=0; height=matrix.at(mid).size()-1; while(low<=height) { mid=(low+height)/2; if(matrix.at(pos).at(mid)==target) return true; if(matrix.at(pos).at(mid)>target) height=mid-1; else if(matrix.at(pos).at(mid)<target) low=mid+1; } return false; } };
code2
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty()||matrix.at(0).empty()||target<matrix.at(0).at(0)||target>matrix.at(matrix.size()-1).at(matrix.at(0).size()-1)) return false; int row=matrix.size(),col=matrix.at(0).size(); int left=0,right=row*col-1; while(left<=right) { int mid=(left+right)/2; int i=mid/col; int j=mid%col; if(matrix.at(i).at(j)==target) return true; else if(matrix.at(i).at(j)<target) left=mid+1; else if(matrix.at(i).at(j)>target) right=mid-1; } return false; } };