原题

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的更多相关文章

  1. 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 ...

  2. 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 ...

  3. [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 ...

  4. LeetCode Smallest Rectangle Enclosing Black Pixels

    原题链接在这里:https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/ 题目: An image is rep ...

  5. 【leetcode】1081. Smallest Subsequence of Distinct Characters

    题目如下: Return the lexicographically smallest subsequence of text that contains all the distinct chara ...

  6. 【LeetCode】1022. Smallest Integer Divisible by K 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【LeetCode】988. Smallest String Starting From Leaf 解题报告(C++ & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...

  8. 【LeetCode】910. Smallest Range II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. 【LeetCode】85. Maximal Rectangle 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/maximal- ...

随机推荐

  1. Django之Form、跨站请求以及cookie、session

    Form表单 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的意义: req ...

  2. (六)利用JackSon工具将JSON文件和对象互转

    1. 需要下载JackSon工具,并导入到: 2. 编写html页面: <!DOCTYPE html> <html> <head> <meta charset ...

  3. nginx多个if条件并且查询

    set $flag 0; if (!-e $request_filename){    set $flag "${flag}1"; } if ($uri ~* "^(.* ...

  4. 【Leetcode_easy】705. Design HashSet

    problem 705. Design HashSet 题意: solution1: class MyHashSet { public: /** Initialize your data struct ...

  5. Tools - 笔记记录方法Markdown

    Markdown 简介 轻量级标记语言,使用易读易写的纯文本格式和类似HTML的标记语法来编写具有一定的格式的文档. 语法简洁直观,易学易用,可以使用任何喜爱的文本编辑器来阅读和写作. 可精- 确控制 ...

  6. iOS-检测网络可连接性

    #pragma mark - 监测网络的可链接性+ (void)netWorkReachabilityWithURLString:(NSString *)strUrl{    AFHTTPReques ...

  7. 【c# 学习笔记】为什么要使用委托

    上一章中我们可能会很疑惑,为什么需要委托?为什么不直接在MyMethod方法里直接调用Add方法,反而要实例化一个委托对象来完成调用呢?这岂不是自找麻烦吗? 当然,c#引入委托并不是自找麻烦.委托是c ...

  8. linux下的进程间通信概述

    管道(PIPE) FIFO(有名管道) XSI消息队列 XSI信号量 XSI共享内存 POSIX信号量 域套接字(Domain Socket) 信号(Signal) 互斥量(Mutex) 其中信号(s ...

  9. APK在Android Studio下如何签名

    apk签名的意义 Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的! Andro ...

  10. 乐字节Java反射之四:反射相关操作

    大家好,乐字节小乐继续为Java初学者讲述Java基础知识.上次说到乐字节Java反射之三:方法.数组.类加载器,这次是Java反射之四:反射相关操作 1.操作属性 //1.获取Class对象 Cla ...