[LeetCode from scratch] Search a 2D Matrix

Source: Internet
Author: User

[LeetCode from scratch] Search a 2D Matrix

Question:

 

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, Returntrue.

    Answer:

    Because of sorting, the idea is clear. Create an index for the first element of each row, then perform binary search for the row, and then perform binary search for the last column. The complexity is O (lg (m) + lg (n )). But the difficulty lies in the details:

     

    The search here may be False, that is, the element cannot be found. Therefore, if first = 1, last = 2, mid = (first + last)/2 = 1. Next time, if first = mid = 1, it falls into a loop. Due to division, it is possibleFailed to get last. If first = 1, last = 2, mid = (first + last)/2 = 1. If first = mid = 1, the value of last = 2 is still not obtained. Therefore, you need to judge the value of last one more time. The search in the index of the first element of each row is different from the column search. Even ifTarget> the maximum value in the index may still exist.. For example, target = 30> 23 still exists.
    class Solution {public:    bool searchMatrix(vector
       
        >& matrix, int target) {        vector
        
          rowfirst;        for(int i=0; i
         
           rowfirst[tail])  head = tail;            else if(target == rowfirst[mid] || target == rowfirst[tail])  return true;            else if(target < rowfirst[mid])   tail = mid;            else if(target > rowfirst[mid])   head = mid;        }        if(head > tail) return false;                int first = 0;        int last  = matrix[0].size() - 1;        while(first <= last){            if(first == last || first + 1 == last){                if (matrix[head][first] == target || matrix[head][last] == target)   return true;                else    return false;            }            int mid = (first + last) / 2;            if(target == matrix[head][mid] || target == matrix[head][last])   return true;            else if(target < matrix[head][mid])   last = mid;            else if(target > matrix[head][mid])   first = mid;        }        return false;    }};
         
        
       

     

     

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.