问题: 编写一个有效的算法,搜索m×n矩阵中的值。
此矩阵具有以下属性:
每行中的整数从左到右排序。 每行的第一个整数大于前一行的最后一个整数。
class Solution {
public:
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
bool searchMatrix(vector<vector<int> > &matrix, int target) {
bool flag = false;
int mbegin = 0, mend = matrix.size() - 1;
// target in matrix?
while (mbegin <= mend) {
int mmid = (mbegin + mend) / 2;
vector<int> sub = matrix[mmid];
int begin = 0, end = sub.size() - 1;
// target in sub?
if (sub[0] <= target && target <= sub[end]) {
while(begin <= end) {
int mid = (begin + end) / 2;
if (sub[mid] == target) {
flag = true;
return flag;
}
else if (sub[mid] < target) {
begin = mid + 1;
}
else {
end = mid - 1;
}
}
}
else if (sub[end] < target) {
mbegin = mmid + 1;
}
else{
mend = mmid - 1;
}
}
return flag;
}
};
输入
[[1,5,9,13,18,25,28,33,39,43,44,51,55,56,63,68,73,77,80],[100,117,141,164,181,199,218,241,265,285,310,326,341,354,370,380,397,408,420],[433,453,475,494,506,518,536,550,568,585,609,626,651,662,676,698,716,729,746],[766,791,809,829,844,869,894,916,930,947,967,981,992,1012,1036,1059,1083,1099,1116],[1137,1150,1163,1177,1199,1215,1231,1243,1268,1283,1304,1326,1344,1362,1387,1408,1428,1438,1461],[1485,1499,1521,1546,1566,1584,1606,1622,1637,1656,1681,1705,1726,1744,1758,1779,1802,1827,1842]]
1084
预期 假
但没有任何表现!为什么呢?
答案 0 :(得分:0)
考虑到这两个属性,以下是您的算法可能的优化:
您必须查看不能被这些条件排除的所有行。如果您必须找到所有出现的情况,则规范不会出现。它也不会告诉您该值是否可以丢失,是否可以保证一次发生或者多次发生。
使用int mmid = (mbegin + mend) / 2;
,看起来好像在尝试二进制搜索。