美文网首页
302. Smallest Rectangle Enclosin

302. Smallest Rectangle Enclosin

作者: Ysgc | 来源:发表于2021-02-03 04:32 被阅读0次

    An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black pixels are connected, i.e., there is only one black region. Pixels are connected horizontally and vertically. Given the location (x, y) of one of the black pixels, return the area of the smallest (axis-aligned) rectangle that encloses all black pixels.

    Example:

    Input:
    [
    "0010",
    "0110",
    "0100"
    ]
    and x = 0, y = 2

    Output: 6


    我的思路:DFS,但是其实和brute force区别不大

    答案的第三种:binary search

    class Solution {
    public:
        int minArea(vector<vector<char>>& image, int x, int y) {
            int leftmost=0, rightmost=0, topmost=0, bottommost=0;
            
            int left=0, right=y, mid, row;
            while (left < right) {
                mid = (left + right)/2;
                for (row=0; row<image.size() and image[row][mid]!='1'; ++row);
                if (row == image.size())
                    left = mid+1;
                else
                    right = mid;
            }
            leftmost = left;
            
            
            left=y, right=image[0].size(); // left=y+1?
            while (left < right) {
                mid = (left + right)/2;
                for (row=0; row<image.size() and image[row][mid]!='1'; ++row);
                if (row == image.size())
                    right = mid;
                else
                    left = mid+1;
            }
            rightmost = left;
            
            
            int top=0, bottom=x, col;
            while (top < bottom) {
                mid = (top + bottom)/2;
                for (col=0; col<image[0].size() and image[mid][col]!='1'; ++col);
                if (col == image[0].size())
                    top = mid+1;
                else
                    bottom = mid;
            }
            topmost = top;
            
            
            top=x, bottom=image.size(); // top=x+1?
            while (top < bottom) {
                mid = (top + bottom)/2;
                for (col=0; col<image[0].size() and image[mid][col]!='1'; ++col);
                if (col == image[0].size())
                    bottom = mid;
                else
                    top = mid+1;
            }
            bottommost = top;
            
            return (rightmost-leftmost)*(bottommost-topmost);
        }
    };
    

    Runtime: 84 ms, faster than 65.52% of C++ online submissions for Smallest Rectangle Enclosing Black Pixels.
    Memory Usage: 16.4 MB, less than 98.28% of C++ online submissions for Smallest Rectangle Enclosing Black Pixels.

    相关文章

      网友评论

          本文标题:302. Smallest Rectangle Enclosin

          本文链接:https://www.haomeiwen.com/subject/srxptltx.html