我已收到一份工作候选人名单作为输入,因此我收到的清单已经按照每个人的工资要求进行排序,并且也是从大学获得的(此参数未分类)。例如:
danny 13000 $ 75.56
dan 9000 $ 100
bob 5000 $ 98
在这样的清单中,我需要找到两个等级较高的候选人,这样两个薪水的总和不超过10000美元(我可以假设他们不是两个同等级的候选人而且没有两个具有相同总和(94 + 90 = 91 + 93)的学生我需要在O(n)的复杂性中找到它们。
我知道我不能做排序算法(min是n * log(n))所以我该怎么做?
有可能吗?
答案 0 :(得分:1)
O(n)
解决方案(假设数字10,000是固定的):
arr <- new empty array of size 10000
for each i from 1 to 10000:
arr[i] = "most valuable" worker with salary up to i
best <- -infinity
for each i from 1 to 5000:
best = max{ best, arr[i] + arr[10000-i]}
return best
我们的想法是在每个条目中保存一个数组,其中包含最多要求工资的“最佳”候选人(这是在第一个循环中完成的)。
在第二个循环中,您将查看所有可行的可能性并找到最大值
请注意,第一个循环的简单方法是O(n)
,其中包含可怕的常量(每次迭代为O(n)
,并且完成10,000次)。但是,您可以使用DP构建arr
,从最低工资开始,并执行以下操作:
arr[i] = max {arr[i-1], best worker with salary i}
DP解决方案为O(n)
,只有一次遍历数组(或正式O(W+n)
,其中W
是最高薪水。)
另请注意 - 这是knapsack problem的私人案例,只能选择2个元素。
答案 1 :(得分:1)
因为按工资开始按两个指针排序。我指向开始(最低的销售)和j指向最高的销售。现在,当销售超过限制减少j。现在增加i并减少j低于限制。跟踪i和j的最高等级。