【leetcode】302.Smallest Rectangle Enclosing Black Pixels
原题
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.
样例:
given the following image:
[
"0010",
"0110",
"0100"
]
and x = 0, y = 2,
Return 6.
解析
求最小覆盖矩形面积
有一个矩阵,由0,1组成,每个1表示一个黑色像素点,
给出第一个黑色像素的位置,求最小的可以覆盖这个矩阵中黑色像素点的矩形大小
思路
一:遍历整个矩阵(缺点,如果矩阵很大,像素点占比很少,则比较浪费)
二:遍历像素点
找出最大最小的x,最大最小的y然后计算矩阵大小
解法
BFS广度有限算法(Queue)
用给出的一个像素点,利用queue,入队第一个像素点,然后入队它上下左右的像素;当队不空时继续遍历,直到所有的像素都遍历一遍
public int minAreaBFS(int[][] image, int x, int y) {
if (image == null || image.length <= 0 || image[0] == null || image[0].length <= 0) {
return 0;
}
int minX = x, minY = y, maxX = x, maxY = y;
Queue<Point> queue = new LinkedList<>();
Point rootP = new Point(x, y);
queue.offer(rootP);
//队不空时就继续
while (!queue.isEmpty()) {
Point p = queue.poll();
minX = Math.min(p.x, minX);
minY = Math.min(p.y, minY);
maxX = Math.max(p.x, maxX);
maxY = Math.max(p.y, maxY);
//判断四周是否有像素,有就入队
check(p.x - 1, p.y, image, queue);
check(p.x + 1, p.y, image, queue);
check(p.x, p.y - 1, image, queue);
check(p.x, p.y + 1, image, queue);
}
return (maxX - minX + 1) * (maxY - minY + 1);
}
private void check(int x, int y, int[][] image, Queue queue) {
int maxR = image.length;
int maxC = image[0].length;
Point p = new Point(x, y);
if (x >= 0 && x < maxR && y >= 0 && y < maxC && image[x][y] == 1) {
//遍历过的点置0
image[x][y] = 0;
queue.offer(p);
}
}
DFS深度优先算法(递归)
用给出的第一个点,递归遍历它的上下左右像素,直到遍历完所有的像素点
public int minAreaDFS(int[][] image, int x, int y) {
if (image == null || image.length <= 0 || image[0] == null || image[0].length <= 0) {
return 0;
}
//数组记录最小x,最小y,最大x,最大y
int[] res = {x, y, x, y};
dfs(x, y, image, res);
return (res[2] - res[0] + 1) * (res[3] - res[1] + 1);
}
private void dfs(int x, int y, int[][] image, int[] res) {
int maxR = image.length;
int maxC = image[0].length;
//若当前点存在且为像素,才继续,否则返回
if (x >= 0 && x < maxR && y >= 0 && y < maxC && image[x][y] == 1) {
image[x][y] = 0;
res[0] = Math.min(x, res[0]);
res[1] = Math.min(y, res[1]);
res[2] = Math.max(x, res[2]);
res[3] = Math.max(y, res[3]);
dfs(x - 1, y, image, res);
dfs(x + 1, y, image, res);
dfs(x, y - 1, image, res);
dfs(x, y + 1, image, res);
}
}
【leetcode】302.Smallest Rectangle Enclosing Black Pixels的更多相关文章
- LC 302. Smallest Rectangle Enclosing Black Pixels【lock, hard】
An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...
- 302. Smallest Rectangle Enclosing Black Pixels
题目: An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The b ...
- [LeetCode] Smallest Rectangle Enclosing Black Pixels 包含黑像素的最小矩阵
An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...
- LeetCode Smallest Rectangle Enclosing Black Pixels
原题链接在这里:https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/ 题目: An image is rep ...
- 【leetcode】1081. Smallest Subsequence of Distinct Characters
题目如下: Return the lexicographically smallest subsequence of text that contains all the distinct chara ...
- 【LeetCode】1022. Smallest Integer Divisible by K 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】988. Smallest String Starting From Leaf 解题报告(C++ & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...
- 【LeetCode】910. Smallest Range II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】85. Maximal Rectangle 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/maximal- ...
随机推荐
- .The server quit without updating PID file (/var/lib/mysql/pc.pid).
启动Mysql是报错 [root@pc mysql]# mysql startERROR 2002 (HY000): Can't connect to local MySQL server throu ...
- python中简化的验证码功能
验证码一般用来验证登陆.交易等行为,减少对端为机器操作的概率,python中可以使用random模块,char()内置函数来实现一个简单的验证码功能. import random def veri_c ...
- C++ - 第一个程序
代码: #include <iostream> using namespace std; int main() { cout << "hello!" < ...
- LeetCode_118. Pascal's Triangle
118. Pascal's Triangle Easy Given a non-negative integer numRows, generate the first numRows of Pasc ...
- react中如何处理日期格式整理
1.第一种模式——对应组件:DatePicker: 需要引入 import moment from "moment"; values.cfjdrq = moment(values. ...
- iOS-textfield控制光标开始位置
// UIView *paddingView1 = [[UIView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.wi ...
- charles 文件菜单总结
本文参考:charles 文件菜单总结 一.file(文件菜单) 需要注意的是 "导入"和"导出"这个功能在和别人沟通的时候用, 比如你向第三方工具/类库开发人 ...
- Zuul1与Spring Cloud Gateway对比
一.API网关 1.1 Zuul1简介 1.2 Spring Cloud Gateway简介 二.对比 2.0 产品对比 2.1 性能对比 2.1.1 低并发场景 2.1.2 高并发场景 2.1.3 ...
- 2019-10-24 李宗盛 spss作业
3.1数据排序. 在统计分析时最初的变量. 可能不符合统计分析的要求,需要用户对目标数据进行整理,来符合分析方法个案排序.数据——个案排序.排序依据,排序顺序,变量排序 数据——变量排序 变量视图 ...
- 工作总结--CTO(张王岩)File的使用
名称 路径分隔符 pathSeparator separator 构造器 文件名.路径名 getName() getPath() getAbsolutePath() getParent ...