algorithm:查找给定范围内的数字计数

时间:2011-04-07 19:02:57

标签: c++ algorithm

给定一个未排序的数字数组,其中可以有重复项,预处理数组,以便找到给定范围内的数字计数,时间为O(1)。

例如,7,2,3,2,4,1,4,6>= 2<= 5的数字均为5(2,2,3,4,4)

4 个答案:

答案 0 :(得分:5)

对数组进行排序。对于排序数组中的每个元素,将该元素插入到哈希表中,将元素的值作为键,并将其在数组中的位置作为关联值。任何跳过的值,您也需要插入。

要查找范围中的项目数,请在哈希表中查找范围每端的值的位置,并从上部减去较低的值以查找范围的大小。

答案 1 :(得分:3)

这听起来像是一些采访者喜欢问的聪明的面试问题,这通常与你看到自己的想法有关。

无论如何......实现此目的的一种可能方法是列出等于或小于列表索引的数字计数。

例如,从上面的列表中,生成列表:0,1,3,4,6,6,7,8。然后,您可以通过从列表中减去列表[1]来计算2到5之间的数字[ 5]。

答案 2 :(得分:0)

由于我们需要在O(1)中访问,所需的数据结构将是内存密集型的 使用哈希表,在最坏的情况下,访问将采用O(n)

我的解决方案:
建立2D矩阵 array = {2,3,2,4,1,4,6}数字范围= 0到6所以n = 7
所以我们要创建nxn矩阵 array [i] [i]表示element = i的总计数 所以array [4] [4] = 2(因为4在数组中出现2次)
数组[5] [5] = 0
array [5] [2] =数字的数量>&gt; = 2且&lt; = 5 = 5

//preprocessing stage 1: Would populate a[i][i] with total count of element = i
a[n][n]={0};
for(i=0;i<=n;i++){
  a[i][i]++;
}

//stage 2
for(i=1;i<=n;i++)
  for(j=0;j<i;j++)
     a[i][j] = a[i-1][j] + a[i][i];
//we are just adding count of element=i to each value in i-1th row and we get ith row.

现在(5,2)将查询[5] [2]并在O(1)中给出答案

答案 3 :(得分:0)

int main()
{   
    int arr[8]={7,2,3,2,4,1,4,6};
    int count[9];
    int total=0;    

    memset(count,0, sizeof(count));

    for(int i=0;i<8;i++)
        count[arr[i]]++;

    for(int k=0;k<9;k++)
    {
        if(k>=2 && k<=5 && count[k]>0 )
        {
            total= total+count[k] ;     
        }
    }

    printf("%d:",total);
    return 0;
}