leetcode-master/problems/kamacoder/0154.序列中位数.md

1.6 KiB
Raw Blame History

序列中位数

题目链接

注意给的数组默认不是有序的!

模拟题排序之后取中位数然后按照b数组 删 a数组中元素再取中位数。

#include<bits/stdc++.h>
using namespace std; 

// 计算并返回中位数
double findMedian(vector<int>& nums) {
    int n = nums.size();
    if (n % 2 == 1) {
        return nums[n / 2]; // 奇数长度,返回中间的元素
    } else {
        // 偶数长度,返回中间两个元素的平均值
        return (nums[n / 2] + nums[n / 2 - 1]) / 2.0;
    }
}


int main(){
    int t;
    cin >> t;
    while(t--){
        int n;
        cin>> n;
        vector<int> a(n);
        vector<int> b(n - 1);
        for(int i = 0; i < n; i++){
            cin >> a[i];
        }
        for(int i = 0; i < n - 1; i++){
            cin >> b[i];
        }
        vector<int> nums = a;
        vector<double> answers; 
        
        sort(nums.begin(), nums.end());
      
        // 把中位数放进结果集
        answers.push_back(findMedian(nums));

        for(int i = 0; i < n - 1; i++){ 
            
            int target = a[b[i]];
            // 删除目标值
            nums.erase(find(nums.begin(), nums.end(), target));
            // 把中位数放进结果集
            answers.push_back(findMedian(nums));

        }

        for(auto answer : answers){  
            // 判断是否是整数
            if(answer == (int)answer) printf("%d ", (int)answer);
            else printf("%.1f ", answer);
        }
        cout << endl;
    }

}