C++ 超过了对协同部队的时间限制

C++ 超过了对协同部队的时间限制,c++,c++11,C++,C++11,我已经在这上面呆了很长时间了。当我提交代码时,我总是得到“超过时间限制”。 我的解决方案是输入数组中的项目,然后确定数组中的最大数字,并将其与后面的元素一起显示,依此类推。 如何使我的算法更有效 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int T, n; cin >> T; wh

我已经在这上面呆了很长时间了。当我提交代码时,我总是得到“超过时间限制”。 我的解决方案是输入数组中的项目,然后确定数组中的最大数字,并将其与后面的元素一起显示,依此类推。 如何使我的算法更有效

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int T, n;
    cin >> T;
    while (T--) {
        //inputting p[n]
        scanf_s("%d", &n);
        int* p = new int[n];
        for (int i = 0; i < n; i++) {
            scanf_s("%d", &p[i]);
        }

        while (n != 0) {
            //*itr = largest element in the array
            auto itr = find(p, p + n, *max_element(p, p + n));
            int index = distance(p, itr);

            for (int i = index; i < n; i++) {
                printf("%d\n", p[i]);
            }
            //deleting element by decreasing n:
            n = index;
        }

        delete[] p;
    }
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
int T,n;
cin>>T;
而(T--){
//输入p[n]
扫描频率(“%d”和“&n”);
int*p=新的int[n];
对于(int i=0;i
您的解决方案是O(n^2),太慢了

通过迭代计算max元素的位置直到给定索引
i
,得到O(n)解

#包括
#包括
#包括
//使用名称空间std;
int main(){
int T;
标准:cin>>T;
而(T--){
//输入p[n]
int n;
标准:cin>>n;
std::向量p(n);
对于(int i=0;i>p[i];
}
std::之前的向量max_(n);
[0]之前的最大值=0;
对于(int i=1;ip[i-1]之前的最大值){
[i]之前的最大值=i;
}否则{
[i]之前的最大值=[i-1]之前的最大值;
}
}
而(n!=0){
int index=n-1之前的最大值;
for(int i=索引;istd::你能在数组中搜索两次吗。花几分钟思考一下
max\u element
返回的内容。看起来你的链接被破坏了,根据我的防火墙,它发起了恶意攻击。这就是我乐于助人的心情的结束。请不要绕道通过隐藏/缩短服务来修复它。@Yunnosch有效。我应该有e说…OP.@Damien认为这个答案很有帮助,抱歉吹毛求疵,但这种误解很普遍,尤其是在没有接受(提示,提示,bassel27)的新用户中,并且会引起混乱,有时会令人沮丧。请接受,阅读,你的解决方案的时间复杂性不是O(n^2)也是?它在while(n!=0)循环中嵌套了一个for循环。我错了吗?不,它是O(n)。确实有2个循环,但外循环的大小与内循环的大小一样减小。在内循环的每次迭代中,都会写入一个数字,并且有一个
n
数字要写入。因此
n
是复杂性。老实说,我不太理解您。while循环执行n次,嵌套的次数为循环每n次执行(n-index)次。为了简单起见,我认为时间复杂度将是O(n*(n-index)),这是O(n^2)。我出了什么错?如果外部while循环执行n次,那么内部循环执行1次,因为它将对应于[I]==I
之前的
max_。尝试手动执行此算法。