子数组的最小排除值

时间:2018-11-05 19:47:02

标签: c++

mex是指minimum excluded value of an array

我有一个包含约300000个元素的数组。然后我有50000对a和b(1 <= a <300000 b <= 300000),计算机需要告诉我数组从a到b的MEX。

示例:

int a[10]={0,1,2,3,0,4,5,4,8,6};
a=3;
b=8;

我们从a [2]末尾到a [7]开始,MEX为1

我做了一个有趣的事情,但是一对不需要30秒钟。

int Mex=0;
vector<int> a;
// fill vector
while (find(a.begin(),a.end(), Mex )!= a.end())
{
    Mex++;
}
cout << Mex;

问题是:如何用C ++实现快速的MEX功能,以便计算机在5秒钟内可以对300000个元素执行50000种各种MEX操作?内存限制为900MB。

2 个答案:

答案 0 :(得分:0)

在这里,我正在对范围进行排序,然后尝试找出mex。

int mex(std::vector<int>& num_list, int start, int end) {
    std::vector<int> range_list(num_list.begin() + start, num_list.begin() + end);
    std::sort(range_list.begin(), range_list.end());
    int mex_val = 0;

    for (auto&el : range_list) {
        int diff = el - mex_val;

        if (diff > 1) {
            break;
        }

        mex_val++;
    }

    return mex_val;

}

int main()
{
    std::vector<int>data = {0,1,2,3,0,4,5,4,8,6};
    cout<<mex(data, 3, 8)<<"\n";

   return 0;
}

答案 1 :(得分:0)

运行一些测试,看看是否适合您。

最坏情况:O((b-a)²)

最佳情况:O(b-a)

#include <iostream>

//Calculate mex starting at myArray[a-1] and ending at myArray[b-1]
int mex(int* myArray, int a, int b){
    int mex = 0; //Lowest positive natural number
    int position = a-1; //To keep track of where you are in the array
    while(position != b){
        if(mex == myArray[position]){
            mex++;
            position = a-1;
        }
        else
            position++;
    }
    return mex;
}

int main(){
    int myArray[10]={0,1,2,3,0,4,5,4,8,6};
    int a = 3;
    int b = 8;
    std::cout << mex(myArray, a, b);
    return 0;
}