问题描述
我已经被这个 problem 困住了很长时间。当我提交代码时,我总是得到“超出时间限制”。 我的解决方案是输入数组的项,然后确定数组中的最大数并将其与后面的元素一起显示,依此类推。 如何让我的算法更高效?
#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;
}
解决方法
你的解决方案是 O(n^2),太慢了。
通过迭代计算最大元素的位置直到给定索引 i
获得 O(n) 解决方案。
#include <iostream>
#include <vector>
#include <algorithm>
//using namespace std;
int main() {
int T;
std::cin >> T;
while (T--) {
//inputting p[n]
int n;
std::cin >> n;
std::vector<int> p(n);
for (int i = 0; i < n; i++) {
std::cin >> p[i];
}
std::vector<int> max_before(n);
max_before[0] = 0;
for (int i = 1; i < n; ++i) {
if (p[i] > p[max_before[i-1]]) {
max_before[i] = i;
} else {
max_before[i] = max_before[i-1];
}
}
while (n != 0) {
int index = max_before[n-1];
for (int i = index; i < n; i++) {
std::cout << p[i] << " ";
}
//deleting element by decreasing n:
n = index;
}
std::cout << '\n';
}
return 0;
}