给你一个满足下述两条属性的 m x n
整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target
,如果 target
在矩阵中,返回 true
;否则,返回 false
。
public class Solution {
public bool SearchMatrix(int[][] matrix, int target) {
int m = matrix.Length, n = matrix[0].Length;
int low = 0, high = m * n - 1;
while(low <= high)
{
int mid = low + (high - low) / 2;
int row = mid / n , column = mid % n;
if(matrix[row][column] == target)
return true;
else if(matrix[row][column] > target)
high = mid -1;
else
low = mid + 1;
}
return false;
}
}
思路:m 行 n 列的矩阵可以转换成长度为 mn 的升序数组。矩阵中的每个位置可以和升序数组中的下标转换:
-
当 0≤i<m 且 0≤j<n 时,矩阵的第 i 行第 j 列等价于升序数组的下标 i×n+j;
-
当 0≤index<mn 时,升序数组的下标 index 等价于矩阵的第 ⌊nindex⌋ 行第 index mod n 列。
为了判断矩阵中是否存在目标值,可以在矩阵转换成的升序数组中二分查找。