将序列的位移定义为最大和最小元素之间的差。给定一个整数序列,找出所有长度为 的连续子序列的最大位移m
。
例如,如果我们的序列是 [1, 5, 7, 0, 2, -4] 并且 m = 3,
- [1, 5, 7] 的位移为 6。
- [5, 7, 0] 的位移为 7。
- [7, 0, 2] 的位移为 7。
- [0, 2, -4] 的位移为 6。
- 所以最大位移是7。
如果我们让 n 表示输入序列的长度,那么我下面的解决方案在 O(nlog(m)) 时间内运行。有没有办法做得更好?我觉得我必须缺少一个线性时间算法。就这个问题而言,我只关心渐近时间复杂度。
#include <vector>
#include <set>
#include <iostream>
int find_max_displacement(std::vector<int> seq, int m){
std::multiset<int> subseq;
// insert the m items of first subsequence into tree
for (int i = 0; i < m; i++){
subseq.insert( seq[i] );
}
int max_disp = *subseq.rbegin() - *subseq.begin(); // max minus min
for (int i = 0; i < seq.size() - m; i++){
subseq.erase(subseq.find(seq[i])); // kick oldest element out of subsequence
subseq.insert( seq[i+m] ); // insert new element into subsequence
int new_disp = *subseq.rbegin() - *subseq.begin();
if (new_disp > max_disp){
max_disp = new_disp;
}
}
return max_disp;
}
int main(){
std::vector<int> arr {1, 5, 7, 0, 2, -4};
int max_disp = find_max_displacement(arr, 3);
std::cout << max_disp << std::endl;
return 0;
}