C++ 中包围黑色像素的最小矩形


假设我们有一张图像,该图像由一个二进制矩阵表示,其中 0 表示白色像素,1 表示黑色像素。这里黑色像素是连接的,所以只有一个黑色区域。像素在水平和垂直方向上连接。如果我们有一个黑色像素的位置 (x, y),我们必须找到包围所有黑色像素的最小(轴对齐)矩形的面积。

因此,如果输入如下所示:

0010
0110
0100

并且 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

更新于: 2020-07-21

313 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告