使用哪种方法搜索密钥

问题描述

我正在尝试一个问题,其中给定数组的大小为'n',所以我将给定数组中元素的范围。例如,如果数组的大小为'9',则我的数组将具有元素为: {0 1 2 3 4 5 6 7 8},我将获得范围为1到6的意思是(1,2,3,4,5,6)。我将获得范围的两个极端,例如此处是(1,6)..该范围是圆形的,例如如果给定的下限大于上限(该范围看起来像说(6,2))..那么它将首先从下限转到n-1(因为索引是基于0的),然后再次从0开始到上限..means((6,2)=(6,7,8,1,2)如果n = 9并且lb = 6> rb = 2 )...并且已经给了我一些这样的范围..我必须从范围中选择任何数字,以使其是唯一的,并且在以前的任何范围内都没有选择..n的约束最大10 ^ 9,给定的最大范围数可以是10 ^ 5 ...

我首先尝试使用布尔数组来跟踪此问题,以跟踪是否已在先前的任何范围内选择此数字。如果是,则将其设置为true。方法很有效,然后一次又一次遍历整个数组

显示超出内存限制。 然后我尝试使用hashmap..bt进行搜索,它显示了较大输入超出了时间限制...

  my hashmap implementation is:

  #include<bits/stdc++.h> 
  using namespace std;
  int main()
   {
  long t;
 cin>>t;
 while(t--){
 long n,m,flag,x,y;
 cin>>n>>m;
 map<long,bool> mp;
 for(long i=0;i<n;i++)
 {
    mp.insert({ i,false });
 }
 map<long,bool>::iterator itr; 
 for(long i=0;i<m;i++)
 {
    flag=0;
    cin>>x>>y;
    if(x<=y){
    for(long j=x;j<=y;j++)
    {
        if((mp.find(j))->second==false)
        {
            (mp.find(j))->second=true;
            flag=1;
            break;
        }
    }
    }
    else{
        for(long k=x;k<n;k++)
        {
        if((mp.find(k))->second==false)
        {
            (mp.find(k))->second==true;
            flag=1;
            break;
        }
        }
        for(long o=0;o<=y;o++)
        {
            if((mp.find(o))->second==false)
        {
            (mp.find(o))->second=true;
            flag=1;
            break;
        }
        }
    }
    if(flag==0)
    {
        cout<<"NO"<<endl;
        break;
    }
}
if(flag==1)
{
    cout<<"YES"<<endl;
}
mp.clear();
}
}

如果有人用自己的解决方案回答这个问题。.我仍然想知道为什么我的代码显示的时限超出了..谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)