302. Smallest Rectangle Enclosing Black Pixels

这题有两种方式,
一种是DFS,一种是Binary search。
这里提供一个binary search简化后的代码。

    public int minArea(char[][] image, int x, int y) {
        int N = image.length, M = image[0].length;
        int rx = x, cy = y;
        int left = findLeftRight(image, 0, cy, true, true);
        int right = findLeftRight(image, cy, M - 1, false, true);
        int top = findLeftRight(image, 0, rx, true, false);
        int bot = findLeftRight(image, rx, N - 1, false, false);
        return (bot - top + 1) * (right - left + 1);
    }
    private boolean containsOne(char[][] image, int rc, boolean sweepRow) {
        if (sweepRow) {
            for (int row = 0; row < image.length; row++) {
                if (image[row][rc] == '1') return true;
            }
        } else {
            for (int col = 0; col < image[0].length; col++) {
                if (image[rc][col] == '1') return true;
            }
        }
        return false;
    }
    private int findLeftRight(char[][] im, int start, int end, boolean left, boolean sweepRow) {
        while (start < end) {
            int mid = left ? start + (end - start) / 2 : end - (end - start) / 2;
            if (containsOne(im, mid, sweepRow)) {
            //下面这一句是我原创的奇技淫巧,一行写完
                int dummy = left ? (end = mid) : (start = mid); 
            } else {
                int dummy = left ? (start = mid + 1) : (end = mid - 1);
            }
        }
        return start;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容