存在 NxM 网格,编号为1,2,...NM
(编号以行方式完成。第一行将包含从 1 到 M <的数字/ strong>,第二行将包含 M + 1 至 2M ,依此类推。)
还列出了 X 数字,范围从 1 到 NM 。
问题:*计算网格线上带边的矩形总数,它包含 X 列中的 K 点 K 范围从 0 到 X的长度。
示例值超过1000字:
Let N=2, M=2 and X=[1,2].
Rectangle containing 0 points: 3
Rectangle containing 1 points: 4
Rectangle containing 2 points: 2
我的方法
我知道此网格中可能存在的矩形总数为n(n+1)m(m+1)/4
,但无法想到其他任何内容。
修改
1≤N,M≤10^ 7
1≤长度X≤10^ 5
1≤列表X中的元素≤N* M
答案 0 :(得分:3)
他是O(n^2 * m^2)
方法。
将行网格线编号为row[0], ..., row[n]
,将列网格线编号为column[0], ..., column[n]
。让f[x][y]
表示矩形中包含X
的点数,其中包含顶边 - row[0]
,底边 - row[x]
,左边 - column[0]
,右边方 - column[y]
。请注意,您只能在f
时间内以自下而上的方式计算O(n*m)
(这是动态编程)。
现在,每个矩形都有顶边 - row[x1]
,底边 - row[x2]
,左边 - column[y1]
,左边column[y2]
(x1<x2
, y1<y2
)您可以将X
点的总数计算为f[x2][y2]-f[x1][y2]-f[x2][y1]+f[x1][y1]
。计算出放在计数图中的数字后,该图将当前矩形中包含的X
中的点数与您遇到此数字的次数相关联。您可以使用hashmap
。
总共有O(n^2*m^2)
。
在您的示例中,对于f
,您有:
f[0][0] = f[0][1] = f[0][2] = f[1][0] = f[2][0] = 0
f[1][1] = 1
f[1][2] = 2
f[2][1] = 1
f[2][2] = 2
现在,对于矩形row[0], row[1], column[1], column[2]
,您有X
中包含在此矩形中的点数:
number = f[1][2]-f[0][2]-f[1][1]+f[0][0] = 2-0-1+0 = 1
这是正确的。
请注意,暴力方法的复杂性为O(n^4 * m^4)
。