C++程序:求所有奇数长度子列表的中位数之和
假设我们有一个名为nums的数字列表,我们需要找到给定列表中所有奇数长度子列表的中位数之和。
例如,如果输入是nums = [2, 4, 6, 3],则输出将是23,因为奇数长度的子列表是-[2],[4],[6],[3],[2, 4, 6],[4, 6, 3],所以中位数之和是2 + 4 + 6 + 3 + 4 + 4 = 23
为了解决这个问题,我们将遵循以下步骤:
ret := 0
for i := 0 to nums.length -1:
创建名为que_max的优先队列
创建名为que_min的另一个优先队列
for j := i to nums.length -1:
将nums[j]插入que_max
while que_max.size() >= 2:
将que_max的顶部元素插入que_min
从que_max删除顶部元素
while (que_min.size() != 0 and que_max.top() > que_min.top()):
a := que_max.top(), 从que_max删除顶部元素
b := que_min.top(), 从que_min删除顶部元素
将b插入que_max
将a插入que_min
if i mod 2 == j mod 2:
ret := ret + que_max.top()
return ret
让我们看看下面的实现,以便更好地理解:
示例
#include <bits/stdc++.h> using namespace std; int solve(vector<int>& nums) { int ret = 0; for (int i = 0; i < nums.size(); i++) { priority_queue<int> que_max; priority_queue<int, vector<int>, greater<int>> que_min; for (int j = i; j < nums.size(); j++) { que_max.push(nums[j]); while (que_max.size() - que_min.size() >= 2) { que_min.push(que_max.top()); que_max.pop(); } while (que_min.size() && que_max.top() > que_min.top()) { int a = que_max.top(); que_max.pop(); int b = que_min.top(); que_min.pop(); que_max.push(b); que_min.push(a); } if (i % 2 == j % 2) { ret += que_max.top(); } } } return ret; } int main(){ vector<int> v = {2, 4, 6, 3}; cout << solve(v); }
输入
{2, 4, 6, 3}
输出
23
广告