[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; }};