给定一个整数数组,找到平均值大于等于K的子数组数量。
约束条件:
1 <= N <= 10^5
-10^9 <= A[i] <= 10^9
我的解决方案:
如果A[i]是数组中第i个索引的前缀和,则
(A[j] - A[i]) / (j - i) >= K
(A[j] - A[i]) >= K * (j - i)
(A[j] - K * j) >= (A[i] - K * i) <- Let's call this expression e
所以表达式e
告诉我,如果我将当前索引的运行总和与-K * current index
一起哈希,那么我只需要搜索小于表达式e
的元素数量。
在处理完ith
索引后,我在哈希表中映射的内容是A [i] - K * i,其中A [i]是数组的运行总和
但我一直在努力寻找一个数据结构,它可以在常数时间或O(logN)
时间内给出小于给定元素的元素数量。
我探索过的解决此问题的数据结构如下:
- 线段树,但约束条件太高了,因为我们需要分配最大大小。
- 多重集合 (
C++
) 并执行 upper_bound (二进制搜索),这将给我迭代器,并且要获得小于X
的元素,我可以找到upper_bound
和begin()
迭代器之间的差异,但此方法的运行时可能会达到O(N)
,然后我的整体运行时间就变成了O(N^2)。
注意:考虑到C ++作为主要语言,我在问题中提到了C ++。
非常期待听到您的想法/建议。