博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
302. Smallest Rectangle Enclosing Black Pixels
阅读量:6084 次
发布时间:2019-06-20

本文共 2173 字,大约阅读时间需要 7 分钟。

302. Smallest Rectangle Enclosing Black Pixels

题目链接:

首先想到的是dfs查找,用left,right,up,down四个变量分别表示最左边,最右边最上面和最下面,最后面积就是(right-left+1) * (down-up+1)

dfs查找的时候如果四周有没visited过的黑点就继续search,同时更新四个变量。

public class Solution {    public int minArea(char[][] image, int x, int y) {        left = y; right = y;        up = x; down = x;        dfs(image, new boolean[image.length][image[0].length], x, y);                return (right - left + 1) * (down - up + 1);    }    int left, right, up, down;    int[][] dirs = new int[][] {
{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; private void dfs(char[][] image, boolean[][] visited, int x, int y) { int m = image.length, n = image[0].length; if(x < 0 || x >= m || y < 0 || y >= n || visited[x][y] || image[x][y] == '0') return; visited[x][y] = true; // update 4 boundary left = Math.min(left, x); right = Math.max(right, x); up = Math.min(up, y); down = Math.max(down, y); for(int[] dir : dirs) { dfs(image, visited, x + dir[0], y + dir[1]); } }}

标签写的是binary search,那么考虑枚举的方式,四个边界的范围分别是:left: [0, y+1], right: [y, n], up: [0, x+1], down: [x, m]

那么分别二分找四个边界。binary search的复杂度是mlogn + nlogm,要好于dfs。

public class Solution {    public int minArea(char[][] image, int x, int y) {        int left, right, up, down;        int m = image.length, n = image[0].length;        left = binarySearch(image, 0, y, 0, m, true, true);        right = binarySearch(image, y+1, n, 0, m, true, false);        up = binarySearch(image, 0, x, left, right, false, true);        down = binarySearch(image, x+1, m, left, right, false, false);        return (right - left) * (down - up);    }        private int binarySearch(char[][] image, int start, int end, int l, int r, boolean col, boolean inc) {        while(start < end) {            int k = l, mid = start + (end - start) / 2;            while(k < r && (col ? image[k][mid] : image[mid][k]) == '0') k++;            // k < r: find black pixel:             // start = mid + 1 if right or down, end = mid if left or up            if((k < r) == inc) end = mid;            else start = mid + 1;        }                return start;    }}

转载地址:http://mhkwa.baihongyu.com/

你可能感兴趣的文章
关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流
查看>>
浅析微信支付:统一下单接口
查看>>
网络对抗技术_实验一_网络侦查与网络扫描
查看>>
黑板模式分析
查看>>
释放Win8.1 WinSxS冗余更新,微软Dism来解决
查看>>
【BZOJ】2243 [SDOI2011]染色
查看>>
springboot集成springsession利用redis来实现session共享
查看>>
文件上传与下载总结
查看>>
【测试基础】测试用例的设计方法
查看>>
MySQL优化-》执行计划和常见索引
查看>>
ThinkPHP中通过URL重写隐藏应用的入口文件index.php的相关服务器的配置
查看>>
18、图片 & 多媒体
查看>>
第七周进度总结
查看>>
Android任务栈的运行规律
查看>>
批处理通用测试代码
查看>>
uva 10594 Data Flow
查看>>
POJ 3592 Instantaneous Transference
查看>>
redis数据类型(字符串)
查看>>
解决火狐浏览器安装不上Selenium IDE插件“此附加组件无法安装”
查看>>
How PD works in Agile team
查看>>