C++ 执行超时(12000毫秒):是否有更好的方法解决此问题?

C++ 执行超时(12000毫秒):是否有更好的方法解决此问题?,c++,C++,我在编码方面有很长的休息时间,所以我一直在做一些编码问题。 在本文中,我通过了测试,但问题在于我的代码效率低下。任务如下: 给定一个向量“arr”和一个数字n,创建一个新的向量,该向量最多包含n次arr,而无需重新排序。例如,如果n=2,输入为[1,2,3,1,2,1,2,3],则取[1,2,3,1,2],删除下一个[1,2],因为这将导致1和2在结果中出现3次,然后取3,这将导致[1,2,3,1,2,3] 这是我的代码: std::vector<int> deleteNth(std

我在编码方面有很长的休息时间,所以我一直在做一些编码问题。 在本文中,我通过了测试,但问题在于我的代码效率低下。任务如下:

给定一个向量“arr”和一个数字n,创建一个新的向量,该向量最多包含n次arr,而无需重新排序。例如,如果n=2,输入为[1,2,3,1,2,1,2,3],则取[1,2,3,1,2],删除下一个[1,2],因为这将导致1和2在结果中出现3次,然后取3,这将导致[1,2,3,1,2,3]

这是我的代码:

std::vector<int> deleteNth(std::vector<int> arr, int n)
{
  std::vector<int>::iterator it=(arr.begin());
  for(;it!=arr.end();it++){
    int temp=*it;
    int counter=0;
    std::vector<int>::iterator it2=it;
    
    for(;it!=arr.end();it++){
      if(*it==temp){
        counter++;
    
        if(counter>n){
          arr.erase(it);
        }
      }
      it=it2;
    }
  }
  return arr;
}
std::vector deleteNth(std::vector arr,int n)
{
std::vector::iterator it=(arr.begin());
for(;it!=arr.end();it++){
int temp=*it;
int计数器=0;
std::vector::iterator it2=it;
for(;it!=arr.end();it++){
如果(*it==temp){
计数器++;
如果(计数器>n){
arr.erase(它);
}
}
it=it2;
}
}
返回arr;
}
对于由此造成的不便,我深表歉意,我们将非常感谢您的帮助

  • 向量
    是一个
    列表
  • 您应该一次完成,使用
    unordered_map
    计算不同值的出现次数;如果低于阈值-将其复制到新列表,如果达到阈值-忽略并移动到下一个元素

  • 对于一般优化,您可能希望了解有关引用的信息。为了获得更好的算法,您需要或者我建议使用
    std::unorderedmap
    。我将创建一个新的
    std::vector result
    来存储结果。将元素添加到无序映射中
    (std::size_t i=0;i
    。然后使用for循环遍历
    arr
    ,检查映射中的元素
    arr[i]
    计数是否大于0,将它添加到你的
    结果
    数组中,并减少映射中该元素的
    计数
    。尝试计算你看到一个元素的次数,如果你看到的次数不超过N次,则将其放入结果中。
    向量
    是一个数组,从中删除任何内容的成本都比从
    列表中删除要高。改变了错误。它应该是一个向量。2.我明白了,我应该去读一下。谢谢你的帮助@Scre-这不是成本问题;我们应该使用需求所说的内容。但是,我们可以争论将
    int
    元素向下移动到向量中并在末尾释放释放的空间与更新列表中的
    next
    指针相比的成本。@Scre从
    std::vector
    的后面删除要比从
    std::list
    的后面删除快。时间复杂度是相同的,但实际上,
    std::list
    会有额外的开销。根据容器的大小和元素的类型,在实践中,在
    std::vector
    上从其他任何地方移除也可能比
    std::list
    更快,尽管
    std::list
    的时间复杂度似乎更好<代码>标准::列表
    对于单独迭代和销毁元素有额外的开销。
    std::vector<int> deleteNth(std::vector<int> arr, int n)
    {
      std::vector<int>::iterator it=(arr.begin());
      for(;it!=arr.end();it++){
        int temp=*it;
        int counter=0;
        std::vector<int>::iterator it2=it;
        
        for(;it!=arr.end();it++){
          if(*it==temp){
            counter++;
        
            if(counter>n){
              arr.erase(it);
            }
          }
          it=it2;
        }
      }
      return arr;
    }