Leetcode 302 Solution

This article provides solution to leetcode question 302 (smallest-rectangle-enclosing-black-pixels)

https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels

Solution

class Solution {
public:
    int minArea(vector<vector<char>>& image, int x, int y) {
        if (image.size() == 0 || image[0].size() == 0)
            return 0;

        int m = image.size();
        int n = image[0].size();

        queue<pair<int, int>> q;
        vector<vector<bool>> visited(m, vector<bool>(n));
        q.push(make_pair(x, y));
        visited[x][y] = 1;

        int left = y;
        int right = y;
        int top = x;
        int bottom = x;

        while (q.empty() == false)
        {
            auto pair = q.front();
            q.pop();

            int x = pair.first;
            int y = pair.second;

            left = min(left, y);
            right = max(right, y);
            top = min(top, x);
            bottom = max(bottom, x);

            if (x > 0 && image[x - 1][y] == '1')
            {
                if (visited[x - 1][y] == 0)
                {
                    q.push(make_pair(x - 1, y));
                    visited[x - 1][y] = 1;
                }
            }

            if (x < m - 1 && image[x + 1][y] == '1')
            {
                if (visited[x + 1][y] == 0)
                {
                    q.push(make_pair(x + 1, y));
                    visited[x + 1][y] = 1;
                }
            }

            if (y > 0 && image[x][y - 1] == '1')
            {
                if (visited[x][y - 1] == 0)
                {
                    q.push(make_pair(x, y - 1));
                    visited[x][y - 1] = 1;
                }
            }

            if (y < n - 1 && image[x][y + 1] == '1')
            {
                if (visited[x][y + 1] == 0)
                {
                    q.push(make_pair(x, y + 1));
                    visited[x][y + 1] = 1;
                }
            }
        }

        return (right - left + 1) * (bottom - top + 1);
    }
};