C++程序 查找第 k 大的子数组之和
给定一个整数数组。编写一个程序,在其中寻找具有负数和正数的数字的连续子数组的第k大的和。
例子:
一种 暴力破解的方法 是将所有连续和存储在另一个数组中,然后对其进行排序并打印第k大的值。但是,当元素的数量很大时,在存储连续和的数组中,由于连续子数组的数量将会很大(二次方),所以该方法将会消耗大量的内存。
一种 高效的方法 是在sum[]数组中存储该数组的预和。我们可以根据索引i和j来寻找从i到j的连续子数组的和,公式如下:sum[j] – sum[i-1]。
为了存储第k大的和,可以使用小根堆(优先队列),其中我们将连续和压入小根堆中,直到我们得到K个元素,一旦我们有了K个元素,就检查该元素是否大于插入到小根堆中的第K个元素,如果是,则将其插入到小根堆中并弹出小根堆中的顶部元素,否则不插入。 最后,小根堆中的顶部元素将是您的答案。
下面是上述方法的实现。
输出:
时间复杂度: O(n^2 log (k))
辅助空间: 小根堆使用了O(k)的额外空间,而我们可以将和数组存储在数组本身中,因为它是没有用的。