从整数流中找到运行中值

时间:2019-06-21 13:25:50

标签: c++ algorithm data-structures heapsort

我必须根据此问题找到运行中的值:https://www.hackerrank.com/challenges/ctci-find-the-running-median

我试图用一个堆来实现。最小堆,用于存储小于当前中位数的元素。我的方法是对数组进行划分,如果数组的大小为奇数,则求最小元素(size / 2-1)倍,如果数组的大小为偶数,则求最小元素(size / 2)倍。每次找到最小的元素时,都与最后一个元素交换,并将大小减小1。此过程仅需要将数组大小的次数减少一半即可达到中位数。我已经在C ++中实现了这种方法,并且在将我的代码替换为hackerrank时获得了TimeOut。 感谢您的帮助,因为我在这个问题上停留了很长时间。

#include <iostream> 
#include <cmath>
#include <cstring>
using namespace std;
int length=0,heapsize;
void min_heapify(float arr[],int i)
{
    int l=(2*i);
    int r=(2*i+1);
    int smallest;
    if(l<=heapsize && arr[l]<arr[i])
    {
        smallest=l;
    }
    else
    {
        smallest=i;
    }
    if(r<=heapsize && arr[r]<arr[smallest])
    {
        smallest=r;
    }
    if(smallest==i)
        return;
    if(smallest!=i)
    {
        float swap=arr[i];
        arr[i]=arr[smallest];
        arr[smallest]=swap;
    }
    min_heapify(arr,smallest);
}
void build_minheap(float arr[])
{
    for(int k=floor(heapsize/2);k>=1;k--)
    {
        min_heapify(arr,k);
    }
}
void increase_value(float arr[], int i, float val)
{
    arr[i]=val;
    int size=i;
    if(length>1)
    {
        while(i>1 && arr[i/2]>arr[i])
        {
            float temp=arr[i/2];
            arr[i/2]=arr[i];
            arr[i]=temp;
            i=i/2;
        }
        heapsize=length;
        build_minheap(arr);
        if(length%2==0)
        {
            int steps=(length/2);
            float avg=0;
            while((steps-1)!=0)
            {
                float temp=arr[1];
                arr[1]=arr[length];
                arr[length]=temp;
                length--;
                heapsize=length;
                min_heapify(arr,1);
                steps--;
            }
            avg+=arr[1];
            float temp=arr[1];
            arr[1]=arr[length];
            arr[length]=temp;
            heapsize--;
            min_heapify(arr,1);
            avg+=arr[1];
            float median=avg/2;
            cout<<median<<endl;
        }
        else
        {
            float steps=floor(length/2);
            while(steps!=0)
            {
                float temp=arr[1];
                arr[1]=arr[length];
                arr[length]=temp;
                length--;
                heapsize=length;
                min_heapify(arr,1);
                steps--;
            }
            float median=arr[1];
            cout<<median<<endl;
        }
    }
    else
    {
        float median=arr[length];
        cout<<median<<endl;
    }
    length=size;
}
void insert_value(float arr[], float val)
{
    length=length+1;
    increase_value(arr,length,val);
}
int main()
{
    int n;
    cin>>n;
    float arr[n+1];
    for(int i=1,val;i<=n;i++)
    {
        cin>>val;
        insert_value(arr,val);
    }
}

0 个答案:

没有答案