查找数组中给定范围内的元素数

时间:2013-12-14 20:20:25

标签: arrays algorithm range

例如,假设我有一个带整数的数组:

  

1 3 4 9 10

我想找到介于1和9(含)之间的元素数,因此它应返回4(因为有4个整数[1,3,4,9]介于1和9之间)。

我想到这样做的一种方法是首先将每个整数 J 放在数组的 Jth 位置,以便查询整数是否存在可以在常量中完成时间。然后你可以简单地浏览范围并检查每个数字是否存在,但这对于大数字来说需要太长时间。

最快的方法是什么?

2 个答案:

答案 0 :(得分:6)

只需将元素放在已排序的数组中,然后在查询中使用binary search(两次)查找较低和较高的数字,即可获得两个索引l (lower),u (upper)。答案是u-l + 1
复杂性O(logN) - 其中N是数组中元素的数量。

索引复杂性(初始化数组,仅执行一次)对于sotring来说是O(nlogn)

在你的例子中

  • 二元搜索1得到l = 0
  • 二元搜索9 yield u = 3
  • 回答= u-l + 1 = 3-0 + 1 = 4

注意:如果数组包含dupes或数字可能不存在 - 需要一些额外的工作 - 但是如何做到这一点的想法仍然是相同的。

答案 1 :(得分:0)

如果左右间隔是数组的一部分,则Amit答案是好的,如果数组是

1 2 3 5 7 9 10

和间隔是[2 8] 在这种情况下,你不能使用二进制搜索搜索8并且不会得到计数

我能想到的唯一解决方案是

for(int i=0;i<size_array;i++){
if(arr[i] >=left || arr[i] <= right)
count++;
}

任何人都可以找到更好的解决方案吗?

相关问题