为什么搜索2D矩阵显示结果无法通过?

时间:2016-02-24 21:55:40

标签: search

问题: 编写一个有效的算法,搜索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

预期 假

但没有任何表现!为什么呢?

1 个答案:

答案 0 :(得分:0)

考虑到这两个属性,以下是您的算法可能的优化:

  • 您可以跳过搜索以您所寻找的数字开头的数字开头的行。
  • 在每一行中,当您的数字大于您所寻求的数字时,您可以停止搜索。

您必须查看不能被这些条件排除的所有行。如果您必须找到所有出现的情况,则规范不会出现。它也不会告诉您该值是否可以丢失,是否可以保证一次发生或者多次发生。

使用int mmid = (mbegin + mend) / 2;,看起来好像在尝试二进制搜索。