给定一个由n个元素组成的数组,我如何找到范围数[min(A [i],A [i + 1]),max(A [i],A [i + 1])]包含给定值k。对于基于零的索引,i位于0 <= a
例如,对于下面的数组,其中a = 1,b = 3;
6 3 2 8 5
假设k = 3,必须在[min(A [1],A [2]),max(A [1],A [2])]和[min(A [2] ],A [3]),max(A [2],A [3])]。这里k = 3出现在[2,3]和[2,8]范围内,所以答案是2。
在某些预先计算的情况下,如何在不到线性时间内找到范围计数?
我不需要确切的代码,只需要对方法/数据结构进行高层概述即可。
谢谢!
答案 0 :(得分:0)
您可以通过预先踢出数组{em> A 的所有元素 i 来填充(A[i-1] <= A[i] and A[i] <= A[i+1]) or ((A[i-1] >= A[i] and A[i] >= A[i+1])
来节省一些时间。然后,对有效间隔范围编号进行计数应该仍然相同。
int ctr = 0;
for(i=a;i<b-1;i++)
{
if ( (A[i]<=k && A[i+1]>= k) || (A[i]>=k && A[i+1]<= k) )
ctr++;
}
printf(" Count: %i", ctr);