Search a 2D Matrix

2013.12.22 04:30

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.

Solution:

  Since the m x n matrix is sorted, we can think of it as an m * n array. Binary search will solve the problem efficiently.

  Time complexity is O(log2(m * n)), space complexity is O(1).

Accepted code:

 1 // 1AC, yeah~ 2D-address mapping on an array, then done with binary search. 
 2 class Solution {
 3 public:
 4     bool searchMatrix(vector<vector<int> > &matrix, int target) {
 5         // IMPORTANT: Please reset any member data you declared, as
 6         // the same Solution instance will be reused for each test case.
 7         int m, n;
 8         int mn;
 9         
10         m = matrix.size();
11         if(m <= 0){
12             return false;
13         }
14         
15         n = matrix[0].size();
16         if(n <= 0){
17             return false;
18         }
19         
20         mn = m * n;
21         
22         int left, mid, right;
23         left = 0;
24         right = mn - 1;
25         while(right >= left){
26             mid = (left + right) / 2;
27             if(target > matrix[mid / n][mid % n]){
28                 left = mid + 1;
29             }else if(target < matrix[mid / n][mid % n]){
30                 right = mid - 1;
31             }else{
32                 return true;
33             }
34         }
35         
36         return false;
37     }
38 };

 

 posted on 2013-12-22 04:31  zhuli19901106  阅读(208)  评论(0编辑  收藏  举报