【发布时间】:2018-10-27 09:26:25
【问题描述】:
我需要一个有效的算法,它可以找到所有连续子序列的差之和,但我不知道该怎么做。
例如,12345的所有连续子序列:
12 (Dif = 1)
23 (Dif = 1)
34 (Dif = 1)
45 (Dif = 1)
123 (Dif = 2)
234 (Dif = 2)
345 (Dif = 2)
1234 (Dif = 3)
2345 (Dif = 3)
12345 (Dif = 4)
Sum of the difference = 20
序列元素的计数 >= 2
每个元素 >= 1
时间限制:1s。
我写了代码,但是太慢了:
#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(0);
iostream::sync_with_stdio(false);
int count;
cin >> count;
int elem;
vector<int> vec;
int sum = 0;
for (int i = 0; i < count; i++) {
cin >> elem;
if (vec.size() > 0) {
sum += abs(vec.back() - elem);
}
vec.push_back(elem);
if (vec.size() > 2) {
sum += abs(*max_element(vec.begin(), vec.end()) - *min_element(vec.begin(), vec.end()));
}
for (int z = 3; z < count; z++) {
if (vec.size() > z) {
sum += abs(*max_element(vec.begin() + i - z + 1, vec.end()) - *min_element(vec.begin() + i - z + 1, vec.end()));
}
}
}
cout << sum;
return 0;
}
我发现子序列的计数可以通过三角形数公式(其中n - 序列长度)找到:
count = 1/2 * n * (n - 1);
对于 n = 300000,子序列的计数为 450 亿。
如何更快地做到这一点?我需要算法。
【问题讨论】:
-
如果你想改进已经工作的代码,最好在SE Code Review询问。