链接:
https://leetcode.com/problems/search-a-2d-matrix/
大意:
在这样的一个二维数组m中查找一个数是否存在:m中每一行的元素为递增,每一行的第一个元素都比上一行的最后一个元素大。例子:
思路:
从第0行开始,找到第一个在该行的最后一个数大于或等于t的行。之后在该行中进行二分查找。时间复杂度O(m[0].length),空间复杂度O(1)。
代码:
class Solution {
public boolean searchMatrix(int[][] m, int t) {
// 快速判断特殊情况
if (m.length == 0 || m[0].length == 0 || t < m[0][0] || t > m[m.length - 1][m[0].length - 1])
return false;
int row = 0; // row为第一个在该行末尾的数>=t的行
while (m[row][m[0].length - 1] < t) {
row++;
}
if (m[row][m[0].length - 1] == t)
return true;
return Arrays.binarySearch(m[row], t) >= 0; // 偷懒 使用自带二分查找方法
}
}
结果:
结论:
时间复杂度应该是可以降到O(log(m[0].length))的。只需要对最后一列的值进行二分查找,找到第一个大于等于t的数所在的行即可。