C++ 中包围黑色像素的最小矩形
假设我们有一张图像,该图像由一个二进制矩阵表示,其中 0 表示白色像素,1 表示黑色像素。这里黑色像素是连接的,所以只有一个黑色区域。像素在水平和垂直方向上连接。如果我们有一个黑色像素的位置 (x, y),我们必须找到包围所有黑色像素的最小(轴对齐)矩形的面积。
因此,如果输入如下所示:
0 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 |
并且 x = 0,y = 2,则输出将为 6
为了解决这个问题,我们将遵循以下步骤:
定义一个二维数组 v
定义一个函数 searchRows(),它将接收 i、j、left、right、one 作为参数。
当 i < j 时,执行以下操作:
mid := i + (j - i) / 2
k := left
当 (k < right 且 v[mid, k] 等于 '0') 时,执行以下操作:
(将 k 加 1)
如果 k < 'right 等于 one,则:
j := mid
否则
i := mid + 1
返回 i
定义一个函数 searchColumn(),它将接收 i、j、top、bottom、one 作为参数。
当 i 不等于 j 时,执行以下操作:
mid := i + (j - i) / 2
k := top
当 (k < bottom 且 v[k, mid] 等于 '0') 时,执行以下操作:
(将 k 加 1)
如果 k < bottom 等于 one,则:
j := mid
否则
i := mid + 1
返回 i
从主方法执行以下操作:
v := image
ret := 0
n := 图像的行大小
m := 图像的列大小
top := searchRows(0, x, 0, m, true)
bottom := searchRows(x + 1, n, 0, m, false)
left := searchColumn(0, y, top, bottom, true)
right := searchColumn(y + 1, m, top, bottom, false)
返回 (right - left) * (bottom - top)
示例
让我们看看以下实现以更好地理解:
#include <bits/stdc++.h> using namespace std; class Solution { public: vector < vector <char> > v; int searchRows(int i, int j, int left, int right, bool one){ while (i < j) { int mid = i + (j - i) / 2; int k = left; while (k < right && v[mid][k] == '0') k++; if (k < right == one) { j = mid; } else { i = mid + 1; } } return i; } int searchColumn(int i, int j, int top, int bottom, bool one){ while (i != j) { int mid = i + (j - i) / 2; int k = top; while (k < bottom && v[k][mid] == '0') k++; if (k < bottom == one) { j = mid; } else { i = mid + 1; } } return i; } int minArea(vector<vector<char>>& image, int x, int y) { v = image; int ret = 0; int n = image.size(); int m = image[0].size(); int top = searchRows(0, x, 0, m, true); int bottom = searchRows(x + 1, n, 0, m, false); int left = searchColumn(0, y, top, bottom, true); int right = searchColumn(y + 1, m, top, bottom, false); return (right - left) * (bottom - top); } }; main(){ Solution ob; vector<vector<char>> v = {{'0','0','1','0'},{'0','1','1','0'},{'0','1','0','0'}}; cout << (ob.minArea(v, 0, 2)); }
输入
{{'0','0','1','0'},{'0','1','1','0'},{'0','1','0','0'}}, 0, 2
输出
6