Problems:
https://leetcode.com/problems/search-a-2d-matrix/
Solution1:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// 矩阵为空,需要注意的是depth和width都需要判断
if(matrix.length == 0 || matrix[0].length == 0) {
return false;
}
// 将target和每行左右两端值进行比较
//1. target大于最右,则进入下一depth
//2. target小于最左,则从上一depth中寻找
int depth = matrix.length;
int width = matrix[0].length;
for (int d = 0; d < depth; d++) {
if(matrix[d][width-1] < target) {
continue;
} else if(matrix[d][0] > target) {
break;
} else {
for(int w = 0; w < width; w++) {
if(matrix[d][w] == target) {
return true;
}
}
}
}
return false;
}
}
TC: O(m+n)
SC: O(1)
Comments:难得自己写出来了一个medium,开心!
Solution2:
官方解法:binary search
将矩阵按行输出,就是一个sorted array,寻找target可以采用binary search的办法,需要处理的点在于如何定位矩阵中“中点”的坐标
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// binary search
if(matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int m = matrix.length;
int n = matrix[0].length;
int start = 0;
int end = m*n-1;
while(start <= end) {
int mid = (start + end) / 2;
int midEle = matrix[mid / n][mid % n]; // 妙点在于如何将mid位置转化成矩阵中的点
if (midEle == target) {
return true;
} else if (midEle < target) {
start = mid + 1;
} else {
end = mid - 1;//注意此处mid-1保证了不会存在start == end进而无限循环的情况
}
}
return false;
}
}
TC: O(logmn)
SC: O(1)