[Leetcode 62] 74 Search a 2D Matrix

Problem:

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.

 

Analysis:

Since each row of the given matrix is sorted, we can use binary search to accelarate the search.

To locate the which to use binary search, we need to find 2 rows that row1's first element is less than target and row2's first element is greater then target. Then apply binary search to row1.

A problem here is the last row will never be searched, so we need to binary search it at last.

 

Code:

 1 class Solution {
 2 public:
 3     bool searchMatrix(vector<vector<int> > &matrix, int target) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         if (matrix.size() == 0) {
 7           return false;  
 8         } else if (matrix.size() == 1) {
 9             return bs(matrix[0], target);
10         } else {
11             for (int i=1; i<matrix.size(); i++) {
12                 if (matrix[i][0] == target || matrix[i-1][0] == target)
13                     return true;
14                 else if (matrix[i][0] > target && matrix[i-1][0] < target)
15                     return bs(matrix[i-1], target);
16             }
17         
18             return bs(matrix[matrix.size()-1], target);
19         }
20     }
21     
22     bool bs(vector<int> &array, int target) {
23         int lo = 0, hi = array.size()-1;
24         
25         while (lo <= hi) {
26             int mid = (lo+hi) / 2;
27             
28             if (array[mid] == target) {
29                 return true;
30             } else if (array[mid] > target) {
31                 hi = mid - 1;
32             } else {
33                 lo = mid + 1;
34             }
35         }
36         
37         return false;
38     }
39 };
View Code

 

posted on 2013-05-26 13:43  freeneng  阅读(181)  评论(0编辑  收藏  举报

导航