绘制网格的3x3子矩形

时间:2016-09-12 14:41:26

标签: algorithm

最近我参加了一个编码竞赛而无法弄清楚this question.问题陈述如下

  

你有一个10^9 * 10^9网格的白色单元格,其中10^5被涂成黑色。对于从j0的每个整数9,输出包含正好j个黑色单元格的3x3子矩形的数量。时间限制为3秒,内存限制为256mb。

我有一个模糊的想法,例如:迭代黑色单元格并检查以黑色单元格为中心的5x5矩形中的单元格,然后计算3x3矩形(我认为这将是O(n)解决方案其中n是黑色单元格的数量,但我不知道如何实现这个或如何处理重复计算。

该网站有一个针对此问题的编辑,但它是日文和Google翻译没有用。

1 个答案:

答案 0 :(得分:4)

我的算法如下:

有2个有序集,public class MapElement extends ScreenElement { private MapView mapView; private GoogleMap gMap; public MapElement(Context con) { super(con); mapView = new MapView(con); gmap = new GoogleMap(); // Set map options and features, size etc. mapView.setMap(gMap); this.addView(mapView); } } 表示点,1表示每个1子矩形的左上角坐标。这是为了有效地搜索重复和黑色单元格

  1. 对于每个黑色单元格,处理它所在的9 3x3个矩形

  2. 对于每个3x3矩形,检查左上角坐标是否已在集合中

    2a上。如果是,请忽略矩形

    2B。如果不是,则计算矩形中黑色单元格的数量(通过检查每个单元格中是否存在黑色单元格)

  3. 将新的左上角坐标插入到集合中,并将3x3添加到相应的计数器中。

  4. 要计算没有任何黑色单元格的1矩形的数量,您可以3x3

    该算法应采取(H-2)*(W-2) - number of rectangles with at least 1 black cell步骤。第1步需要~O(Nlog(N))次,第2步需要O(N)。第3步需要O(9*9*logN) = O(logN)时间。