假设我在笛卡尔坐标系中给出了线段的数量。每条线给出为[x0,y0]和[x1,y1]。算法应该找到一条垂直的交叉最大行数。 在这个例子中,它跨越了四行:
什么算法能以最小的复杂度做到这一点?(我更喜欢c ++,但某些伪代码也可以)
P.S需要考虑的是多条线在同一个x坐标中开始/结束
谢谢。
答案 0 :(得分:9)
O(n lg n)时间复杂度
答案 1 :(得分:1)
如果你想要垂直,那么这里不需要y
。算法如下。
在数组上运行并获取属于最大给定间隔数的段
vector<pair<double, unsigned char> > points; // (point, flag) pairs
//read [x0, x1]s to points, be sure that x0 <= x1 (swap them otherwise)
//0 for x0, 1 for x1
sort(points.begin(), points.end());
int ans = 0;
int curstate = 0;
for(int i = 0; i < points.size(); ++i)
{
if(points[i].second == 0)
++curstate;
else
--curstate;
ans = max(ans, curstate);
}
答案 2 :(得分:0)
遍历现有行的combinations。为每个迭代构建一个列表,其中包含当前行不perpendicular的所有其他行。按大小按列降序排列列表。具有最大尺寸的(第一)列表将是解决方案。它将包含一个交叉的行列表。有无限数量的线可以作为解决方案。把你的一些工资作为特许权使用费寄给我;)