/**************************************************************************
*
* 74. [Search a 2D Matrix](https://leetcode.com/problems/search-a-2d-matrix/)
*
* 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.
*
* Example 1:
* Input:
* matrix = [
* [1, 3, 5, 7],
* [10, 11, 16, 20],
* [23, 30, 34, 50]
* ]
* target = 3
* Output: true
*
* Example 2:
* Input:
* matrix = [
* [1, 3, 5, 7],
* [10, 11, 16, 20],
* [23, 30, 34, 50]
* ]
* target = 13
* Output: false
*
* 类似 剑指offer 3
**************************************************************************/
//
//
/// Approch 1: cut branch
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
if (NULL == matrix || NULL == matrixColSize || \
matrixSize <= 0 || *matrixColSize <= 0)
return false;
// from top - right
int row = 0;
int col = *matrixColSize - 1;
while (row <= matrixSize - 1 && col >= 0) {
if (matrix[row][col] < target) {
row++;
} else if (matrix[row][col] > target) {
col--;
} else {
return true;
}
}
return false;
}
//
//
/// Approch 2: binary search, rows * cols may overflow
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
if (NULL == matrix || NULL == matrixColSize || \
matrixSize <= 0 || *matrixColSize <= 0)
return false;
int rows = matrixSize;
int cols = *matrixColSize;
int first = 0;
int last = rows * cols - 1;
while (first <= last) {
int mid = (first + last) / 2;
int val = matrix[mid/cols][mid%cols];
if (val == target) return true;
else if (val < target) first = mid + 1;
else last = mid - 1;
}
return false;
}