C++ 执行超时(12000毫秒):是否有更好的方法解决此问题?
我在编码方面有很长的休息时间,所以我一直在做一些编码问题。 在本文中,我通过了测试,但问题在于我的代码效率低下。任务如下: 给定一个向量“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] 这是我的代码: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
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;
}