- 2.14
- mid 值必须,定义 midVal 值需要都对 n 取商取余
- 即:在矩阵的一维与二维坐标互相转换时,一切都跟
n(列数/行宽)有关,跟m(行数)没有任何关系:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int row = 0;
int col=0;
int l = 0;
int r = m*n-1;
while(l<=r){
int mid = (l+r)/2;
int midVal = matrix[mid/n][mid%n];
if(midVal==target) return true;
if(midVal<target){
l = mid+1;
}else{
r = mid-1;
}
}
return false;
}
}-
1.31
- 记住了定位,但是忘了 col 在前,row 在后,而且依旧`left⇐right·
-
1.20
- 依旧没记住 midVal 定位问题 mid/n 与 mid%n,两个都是以 列 n 为取整取余的
-
11.17
- 主要就是没记住二维数组的midVal定位问题
int midVal = matrix[mid/n][mid%n]; - right 为展平后数组的长度m*n-1
- 其他到没什么问题
- 主要就是没记住二维数组的midVal定位问题
[1,3,5,7]
[10,11,16,20]
[23,30,34,60]
m=3,n=4
mid = 7
row = 7 / 4 = 1
col = 7 % 4 = 3
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int left = 0, right = m*n-1;
while(left<=right){
int mid = (left+right)/2;
int midValue = matrix[mid/n][mid%n];
if(midValue ==target) return true;
else if(midValue<target) left = mid+1;
else right = mid-1;
}
return false;
}
}- 就是把二维数组展开,需要注意一下
- 我们可以把
(row, col)映射到一个虚拟的一维下标index = row * n + col; - 反过来:
row = index / ncol = index % n