从最后一列的第一个数字开始比较,依次倒数第二列第一个数字、倒数第三列...
找到第一个 <= target 的数字,这样可以将范围缩小到一列
然后用二分查找快速判断目标元素有没有
好吧为了方便我还是横着来
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
if (!m) return false;
int n = matrix[0].size();
if (!n) return false;
for (int i =m - 1; i >= 0; i--) {
if (matrix[i][0] <= target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (matrix[i][mid] == target) return true;
else if (matrix[i][mid] > target) right = mid - 1;
else left = mid + 1;
}
}
}
return false;
}
这个非空检查看起来确实很不好看,但是我也不知道为什么要给这么个测试用例,一下子也没想到更优雅的写法
然后空间和时间效率都不算高