在平方二进制矩阵中找到二进制矩形的位置

时间:2015-12-18 22:35:21

标签: c++ algorithm recursion binary-search

给定平方二进制矩阵,我必须找到" 1'"它坚持矩阵的右边界。因此,总而言之,我必须找到的是左上角矩形的坐标。

P.S :1。总是有一个矩形,最小的是在对接垫右边的垫子上的1 * 1。

  1. 基于对' getupperleft'的调用的尺寸。功能(n =垫的尺寸)

  2. 仅在矩形内部1s,0s始终在外面。

  3. 为了说明,

    enter image description here

    此处矩形从第4列第3行开始。(左上角坐标)

    我的想法是使用两次BinarySearch来获得Log(n)中的答案,但是我坚持实现它,这与c ++语法不同。非常感谢你的帮助!

    void getUpperLeft(int mat[][N], int n, int &row, int &col);
    void main()
    {
        int row = -1;
        int col = -1;
        int matrix[8][N] = {
        {0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0},
        {0,0,0,0,0,1,1,1},
        {0,0,0,0,0,1,1,1},
        {0,0,0,0,0,1,1,1},
        {0,0,0,0,0,1,1,1},
        {0,0,0,0,0,1,1,1} };
    
    }
    
    void getUpperLeft(int mat[][N], int n, int & row, int & col)
    {
        int mid = N - (n / 2);
        if (mat[N][mid] == 1 && mat[N][mid-1] == 0)
        {
            col = mid;
        }
        else if (mat[N][mid] == 0 && mat[N][mid+1] == 0)
        {
            getUpperLeft(mat, n/2 , row, col);
        }
        else if (mat[N][mid] == 1 && mat[N][mid+1] == 1)
        {
            getUpperLeft(mat, N-(n/2), row, col);
        }
    }
    

2 个答案:

答案 0 :(得分:2)

您可以对最后一列执行二进制搜索,以查找具有1值的第一行,并类似地在最后一行执行另一个二进制搜索,以查找具有1值的第一列。这将为您提供1s矩形的左上角。

复杂性是O(log n)时间,O(1)空间

答案 1 :(得分:1)

正如其他人所指出的那样,您的代码中存在维度硬编码的问题。显然,您应该在代码和以下内容中解决这个问题。话虽如此,这将有效:

int findCol(const int matrix[8][8]) {                                                                                                                                                                    
    int lo = 0, hi = 8 - 1;
    while (lo < hi) {
        int mid = lo + (hi - lo)/2;
        if (matrix[7][mid] < 1)
            lo = mid + 1;
        else
            hi = mid;
    }   
    return lo; 
}   


int findRow(const int matrix[8][8]) {
    int lo = 0, hi = 8 - 1;
    while (lo < hi) {
        int mid = lo + (hi - lo)/2;
        if (matrix[mid][7] < 1)
            lo = mid + 1;
        else
            hi = mid;
    }   
    return lo;
}

前一个函数在最后一行执行二进制搜索,后者在最后一列执行二进制搜索。