给定一个未排序的数字数组,其中可以有重复项,预处理数组,以便找到给定范围内的数字计数,时间为O(1)。
例如,7,2,3,2,4,1,4,6
。 >= 2
和<= 5
的数字均为5
。 (2,2,3,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;
}