我正在处理一个问题,我有一些时间设置(开始 - 结束),我必须给出列表,以便完成最大数量的工作。
可以在On中完成吗?
答案 0 :(得分:1)
让工作为j1(s1,e1),j2(s2,e2),...,jn(sn,en) 其中s1,s2,s3,...,sn是作业的起始时间和 e1,e2,e3,...,en是作业的结束时间。
现在根据工作的开始时间对工作进行排序(si' s) (使用任何算法(O(n lg n))。 另请注意作业#(您可以将作业#存储在另一个数组中。 当您对作业进行分类时,开始时间,也可以对相应的作业#array进行排序。
现在从列表中取出最后一个作业(现在已经排序),并将其放入最终答案列表中。
从上一个作业以后退方式扫描列表 并继续检查上一份工作可以采取的工作 已经被带走了。此作业的结束时间小于或等于上一个作业的开始时间。将此职位添加到最终答案列表中。
现在对此工作执行相同的操作。扫描此索引中的列表并获取作业,使其结束时间小于或等于上次添加到最终答案列表的作业的开始时间。重复此操作直到完成。
现在只计算最终答案列表中的工作数量。 这是可以完成的最大工作数。
整个过程需要O(n lg n)+ O(n)时间。 (如果使用非基于比较的排序算法(如Radix Sort)对起始时间进行排序,则可以减少这种情况。然后复杂性变为O(n)。
答案 1 :(得分:0)
好吧我得到了解决方案,它可以通过Greedy算法完成 详情如下: http://www.cs.umd.edu/class/fall2009/cmsc451/lectures/Lec04-interval.pdf