classSolution { public: vector<double> medianSlidingWindow(vector<int>& nums, int k){ int n = nums.size(); vector<int> saveNums(nums); int left = 0; vector<double> res;
while (left + k <= n) { nums = saveNums; sort(nums.begin() + left, nums.begin() + left + k); int a = nums[(2 * left + k - 1) / 2], b = nums[(2 * left + k) / 2]; res.push_back((a - b) / 2.0 + b); // 2.0保证转换为小数,(a-b)/2.0+b避免溢出 left++; }
classSolution { public: vector<double> medianSlidingWindow(vector<int>& nums, int k){ int n = nums.size(); vector<double> res;
for (int i = 0; i < k; i++) small.push(nums[i]); for (int i = 0; i < k / 2; i++) { big.push(small.top()); small.pop(); } int smallOverBig = 0; // small数据的堆的元素个数比big数据的堆的元素个数多多少,初始为0,假设多1个的奇数状态也算平衡
int left = 0, right = k; // [left, right) while (right <= n) { // 在计算中位数之前,首先把可能影响中位数计算的可延迟删除的数据删除掉 while (!small.empty() && delayed[small.top()] != 0) { delayed[small.top()]--; small.pop(); } while (!big.empty() && delayed[big.top()] != 0) { delayed[big.top()]--; big.pop(); }
res.push_back(getMedian(k)); if (right == n) break;