将序列的位移定义为最大和最小元素之间的差值。给定一个整数序列,找到长度为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;
}
真的很整齐!非常感谢! – 2014-12-05 22:37:57