写出一个高效的算法来搜索 m × n矩阵中的值。 这个矩阵具有以下特性: 每行中的整数从左到右是排序的。 每行的第一个数大于上一行的最后一个整数。 样例 考虑下列矩阵:
代码语言:javascript复制[[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3,返回 true
二分法
二分法是很容易想到的,先找行,再找列。 这种二分查找应该形成自己的一套写法,二维的就降维处理。 就是写得时候一个小地方的变量写错了,造成了死循环,搞了半个小时不知道错在哪里。还是到VS调试了一下才知道是哪里: 这个就是看着复杂,实际上还是很简单的:
代码语言:javascript复制 bool searchMatrix(vector<vector<int>> &matrix, int target) {
int row_sz=matrix.size();
if(row_sz<1)
return false;
int col_sz=matrix[0].size();
if(target<matrix[0][0]||target>matrix[row_sz-1][col_sz-1])
return false;
int high=0;
int low=row_sz-1;
int mid;
while(high<=low)
{
mid=high (low-high)/2;
if(matrix[mid][0]==target||matrix[mid][col_sz-1]==target)
return true;
else if(matrix[mid][0]<target&&matrix[mid][col_sz-1]>target) //刚好落在这个区间
{
break;
}
else if(matrix[mid][0]>target)
{
low=mid-1;
}
else if(matrix[mid][col_sz-1]<target)
{
high=mid 1;
}
}
int left=0;
int right=col_sz-1;
int col_mid;
while(left<right)
{
col_mid=left (right-left)/2;
if(matrix[mid][col_mid]==target)
{
return true;
}
else if(matrix[mid][col_mid]<target)
{
left=col_mid 1; //就是这里,col_mid写成Mid了,导致死循环,气的很
}
else if(matrix[mid][col_mid]>target)
{
right=col_mid-1;
}
}
return false;
// write your code here
}