【发布时间】:2014-06-30 08:38:11
【问题描述】:
我正在做一个练习编程问题,并被困在通过这个问题的时间限制。是否有另一种有效的算法来通过时间限制?
我已经对数组进行了排序,但我认为这仍然没有多大帮助。
这是我的伪代码:
sort boxA
sort boxB
for i in boxA:
for j in boxB:
if i+j < value:
break
else if i+j > value:
count+=1
print the count
set count = 0
问题是要输出多少个boxA+boxB的组合大于等于这个值。
输入:
5 3 1200 #number of boxA | number of boxB | value
100 110 160 750 1030 #number of boxA
400 500 500 #number of boxB
输出:
5
说明: 有五种方式组合 boxA 和 boxB 使得 value >= value
1. 750 + 500
2. 750 + 500
3. 1030 + 400
4. 1030 + 500
5. 1030 + 500
BoxA 和 boxB 的列表中可以有 500000 个项目。我认为这种测试用例对我的算法进行了时间限制。
你能展示另一种有效的算法来解决这个问题吗?谢谢你。
【问题讨论】:
-
您考虑过使用
<algorithm>吗? -
是的,我已经使用 std::sort 从最大值对数组进行排序。
-
您可以使用二等分 B 框将复杂度从 O(nm) 降低到 O(nlog m)
-
<algorithm>中还有很多其他的useful functions。 -
如果对 boxA 中的每个元素进行排序,则无需遍历 boxB 中的所有元素。如果它们是排序的,那么你知道 boxA[i+1]+boxB[j]>=boxA[i]+boxB[j]。您可以利用这些知识来优化内部循环。