给定一个未排序的数字数组,其中可能存在重复项,预处理数组以便在给定范围内查找数字计数时,时间复杂度为O(1)。
例如,7,2,3,2,4,1,4,6。数字>=2且<=5的计数为5。(2,2,3,4,4)。
例如,7,2,3,2,4,1,4,6。数字>=2且<=5的计数为5。(2,2,3,4,4)。
对数组进行排序。对于已排序的每个元素,将该元素插入哈希表中,以元素的值作为键,以其在数组中的位置作为关联值。需要插入任何被跳过的值。
要查找范围内的项目数,请在哈希表中查找范围两端的值的位置,并从上限减去下限以找到范围的大小。
由于我们需要O(1)访问,所需的数据结构将需要占用大量内存。
使用哈希表,最坏情况下访问时间为O(n)。
我的解决方案:
构建一个二维矩阵。
数组 = {2,3,2,4,1,4,6} 数字范围为0到6,因此n = 7。
因此,我们必须创建nxn矩阵。
array[i][i]表示元素i的总计数。
因此,array[4][4] = 2(因为4在数组中出现了2次)
array[5][5] = 0
array[5][2] = >=2且<=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.
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;
}