给定平方二进制矩阵,我必须找到" 1'"它坚持矩阵的右边界。因此,总而言之,我必须找到的是左上角矩形的坐标。
P.S :1。总是有一个矩形,最小的是在对接垫右边的垫子上的1 * 1。
基于对' getupperleft'的调用的尺寸。功能(n =垫的尺寸)
仅在矩形内部1s,0s始终在外面。
为了说明,
此处矩形从第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);
}
}
答案 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;
}
前一个函数在最后一行执行二进制搜索,后者在最后一列执行二进制搜索。