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。
答案 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;
}