假设我有一个人员列表,其中包含他们在过去发生的事件中的到达和离开时间。
我的任务是在任何时候找出活动中最多人数?我没有给出查询时间。
ai =我的到达时间
di =我的离开时间
我有一对像(a1,d1),(a2,d2),(a3,d3)....(an,dn)... 它不在数据库中。
在这个问题中,我们可以看到活动的最大人数是3 所以在这个例子中。对于大小为3的问题,我们有五种解决方案。 {b,d,e},{j,h,i},{c,b,a},{e,g,f},{g,h ,f} 。 我只想知道数字3.
我的方法:
一世。创建一个size =最后出发时间 - 首次到达时间的数组。并继续增加该数组的计数
II。我试图按照他们的开始时间对人们进行排序。并继续跳
下一个人的开始时间。在那之后,我迷路了。应该怎样
我继续。
谢谢
@ypnos: //在时间戳上对数据进行排序。
int count = 0;
int max = 0
char [] arr = {a1, a2, d1, a3, a4, d3, d2, } like this..
for(int i =0; i < arr.length; i++)
{
if(arr[i].startswith('a') )
{
count++;
if(count > max)
{
max = count;
}
}
else
{
count--;
}
}
答案 0 :(得分:6)
首先,您创建一个包含到达和离开时间的排序列表。它是两个事件的单个列表,每个事件都包含一个时间戳(什么是排序键)和一个布尔值(到达或离开)。
新解决方案(找到最大值):
然后你可以遍历你的列表,记住每个条目的当前数字,并相应地增加/减少它,同时也适当地更新你的最大数量。
排序:O(N log N),找到最大值。数字:O(N)
由于问题中的错误措辞(在时间X查询)导致的旧解决方案:
获得该列表后,您将创建一个地图,其中时间戳为关键字,当前时间戳记的人数为数据。要创建它,您需要浏览已排序的列表,记住每个条目的当前数字,并相应地增加/减少它,同时还将元素添加到地图中。
现在您已拥有地图,您可以通过在查询时间戳左侧的地图中搜索元素来轻松找到正确的数字。
使用地图我的意思是二叉树,或者什么是std :: map的基础。顺便说一句。 std :: map为您提供了lower_bound()函数(ref)。
但是,自己实现二叉树并不困难。现在考虑操作的成本:每个条目O(log N),每个查询O(log N)。
答案 1 :(得分:0)
这是在数据库中吗?如果是这样,您只需选择到达时间&lt;的行。现在&lt;出发时间。
这是一件很简单的事情,但我们需要知道您使用什么数据结构来保存数据以提供特定的解决方案。
方法很简单:一组字典,其中每个字典由到达:值和出发:值组成。然后在任何给定的时间,您迭代数组,如果: 到达&lt;现在&lt;出发==如果您增加一个柜台,则为真。
完成。
答案 2 :(得分:0)
迭代列表,测试给定时间t
是否在当前对的到达和离开之间,如果是这种情况则递增计数器。之后你应该在柜台上有正确的号码。伪代码:
given time T
given list of (arrival, departure) pairs L
c = 0
for each pair (A, D) in L
if A < T and T < D
c += 1
请注意,这不是最佳解决方案......将数据存储在更适合查询的结构中,可以实现更高效的解决方案。
答案 3 :(得分:0)
在SQL中?
SELECT count(id) FROM attendee WHERE a_time < '2013-03-01 12:12' AND (d_time > '2013-03-01 12:12' OR d_time IS NULL)