美文网首页
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