將序列的位移定義爲最大和最小元素之間的差值。給定一個整數序列,找到長度爲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