最近我参加了一个编码竞赛而无法弄清楚this question.问题陈述如下
你有一个
10^9 * 10^9
网格的白色单元格,其中10^5
被涂成黑色。对于从j
到0
的每个整数9
,输出包含正好j
个黑色单元格的3x3子矩形的数量。时间限制为3秒,内存限制为256mb。
我有一个模糊的想法,例如:迭代黑色单元格并检查以黑色单元格为中心的5x5矩形中的单元格,然后计算3x3矩形(我认为这将是O(n)
解决方案其中n
是黑色单元格的数量,但我不知道如何实现这个或如何处理重复计算。
该网站有一个针对此问题的编辑,但它是日文和Google翻译没有用。
答案 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
子矩形的左上角坐标。这是为了有效地搜索重复和黑色单元格
对于每个黑色单元格,处理它所在的9 3x3
个矩形
对于每个3x3
矩形,检查左上角坐标是否已在集合中
2a上。如果是,请忽略矩形
2B。如果不是,则计算矩形中黑色单元格的数量(通过检查每个单元格中是否存在黑色单元格)
将新的左上角坐标插入到集合中,并将3x3
添加到相应的计数器中。
要计算没有任何黑色单元格的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)
时间。