C++ 算法:查找给定范围内的数字计数
给定一个可能存在重复项的未排序数字数组,对该数组进行预处理,以便找到给定范围内的数字计数,时间为O(1)C++ 算法:查找给定范围内的数字计数,c++,algorithm,C++,Algorithm,给定一个可能存在重复项的未排序数字数组,对该数组进行预处理,以便找到给定范围内的数字计数,时间为O(1) 例如,7,2,3,2,4,1,4,6。数字的计数>=2和对数组进行排序。对于排序数组中的每个元素,将该元素插入哈希表,元素的值作为键,其在数组中的位置作为关联值。任何被跳过的值,也需要插入 要查找某个范围内的项目数,请在哈希表中查找该范围两端的值的位置,然后从上限中减去下限以确定该范围的大小。这听起来像是一些面试官喜欢问的聪明面试问题之一,这通常与你思考过程中的暗示联系在一起 不管怎样。。。
例如,
7,2,3,2,4,1,4,6
。数字的计数>=2
和对数组进行排序。对于排序数组中的每个元素,将该元素插入哈希表,元素的值作为键,其在数组中的位置作为关联值。任何被跳过的值,也需要插入
要查找某个范围内的项目数,请在哈希表中查找该范围两端的值的位置,然后从上限中减去下限以确定该范围的大小。这听起来像是一些面试官喜欢问的聪明面试问题之一,这通常与你思考过程中的暗示联系在一起
不管怎样。。。实现这一点的一种可能方法是使数字的计数列表等于或小于列表索引
例如,从上面的列表生成列表:0、1、3、4、6、6、7、8。然后,您可以通过从列表[5]中减去列表[1]来计算2到5之间的数字。因为我们需要在O(1)中进行访问,所以所需的数据结构将占用大量内存。
对于哈希表,在最坏的情况下访问需要O(n)
我的解决方案:
构建二维矩阵。
数组={2,3,2,4,1,4,6}数字范围=0到6所以n=7
所以我们必须创建nxn矩阵。
数组[i][i]表示元素=i的总计数
所以数组[4][4]=2(因为4在数组中出现了2次)
数组[5][5]=0
数组[5][2]=数的计数>=2和int main()
{
int-arr[8]={7,2,3,2,4,1,4,6};
整数计数[9];
int-total=0;
memset(count,0,sizeof(count));
对于(inti=0;iis是“预处理”的O(1)部分?我不认为这是可能的。我猜您的意思是预处理数组,以便结果可以计算O(1)中给定条件的数量?听起来像是家庭作业?如果是,请标记它。允许的最小/最大范围是什么?我只会在输入数组从不稀疏的情况下这样做,否则您可能会构造一个非常大的哈希映射。或者将每个元素的单个计数存储在哈希映射中,并检查范围中的每个项目。不是O(1)但是。该解决方案如何处理原始数组中的重复数字?以OP为例,您如何区分前4个和第二个?@pmr:是的,如果您的输入非常稀疏,这将是非常浪费的。@DShook:您有两个选择。两个明显的选择是跟踪第一个和最后一个位置,并跟踪第一个位置和相等元素的计数。通过bucketing可能可以节省一些空间。因此,如果输入范围为[l,u]在l和u附近查找最接近的10的倍数,并将其用于哈希查找。然后对不超过20个额外/遗漏的项执行另一次哈希查找。没有理由使用哈希表,因为您要为[MIN,MAX]范围内的每个键插入一个键值对。只需使用一个数组。即使如此,它也是O(1)只有当数字本身来自一个有限的范围(例如,如果它们保证适合于常规整数)。为了学究,如果列表类型不适合于常规整数,它不会停止为O(1)。它完全停止工作(因为在许多/大多数系统上,所需的内存超过了可寻址空间)。但是,此系统可以处理任何大于int的值计数。因为生成的计数数组没有理由不能使用比uint更复杂的计数器。
//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.
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;
}