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

更新于:2020-12-25

214 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告