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
.
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int i = 0;
int j = matrix.size()-1;
int mid = 0;
//搜寻第一列
while(i <= j){
mid = (i + j)/2;
if(matrix[mid][0] == target){
return true;
}else if(matrix[mid][0] < target){
i = mid + 1;
}else{
j = mid - 1;
}
}
<code class="java keyword"> if</code><code class="java plain">(m[mid][</code><code class="java value">0</code><code class="java plain">] > target){</code><div class="line number20 index19 alt1"><code class="java spaces"> </code><code class="java keyword">if</code><code class="java plain">(mid == </code><code class="java value">0</code><code class="java plain">){</code></div><div class="line number21 index20 alt2"><code class="java spaces"> </code><code class="java keyword">return</code> <code class="java keyword">false</code><code class="java plain">;</code></div><div class="line number22 index21 alt1"><code class="java spaces"> </code><code class="java plain">}</code></div><div class="line number23 index22 alt2"><code class="java spaces"> </code><code class="java plain">mid--;</code><code class="java comments">//mid-1</code></div><div class="line number24 index23 alt1"><code class="java spaces"> </code><code class="java plain">}</code></div>
//搜寻mid行
i = 0;
j = matrix[0].size() -1;
int k = mid;
//搜寻到了返回true
while(i <= j){
mid = (i + j)/2;
if(matrix[k][mid] == target){
return true;
}else if(matrix[k][mid] < target){
i = mid + 1;
}else{
j = mid - 1;
}
}
//没有搜寻到,返回false
return false;
}
};