題:求隨機數構成的陣列中找到長度大於=3的最長的等差數列
輸出等差數列由小到大:分析:如果沒有符合條件的就輸出[0,0]
格式:輸入[1,3,0,5,-1,6]
輸出[-1,1,3,5]
要求時間複雜度,空間複雜度盡量小
基本演算法思路(採用動態規劃思想):首先,只要得到數列的公差和乙個首項就可以確定乙個等差數列,因此我們要尋找最長等差數列的公差以及首項。其次,為了方便查詢公差和首項,我們應該將原陣列進行由小到大排序,這樣各兩數之間的公差也是成遞增形勢的,這樣我們就可以避免回溯查詢首項。
因此,在搜尋公差及首項的過程中,我們可以分兩三個決策階段:
1、如果公差為0,應該做何處理。針對以上情況,我們應該選擇一種合適的資料結構——平衡排序樹,stl中的set,map,mutiset,multimap是以紅黑樹結構為形勢的容器,無疑是非常合適的,根據題目情況,可能存在具有相同元素的陣列,因此我們選擇multiset,這樣無論我們對資料進行插入排序,查詢都是比較高效的,因此總體上是可以滿意的。2、如果公差不為0,應該做何處理。
3、如果找到的數列長度是當前最長的做相應的處理
最後有幾項時間上的優化不在這裡說明,詳情可看**。若有不足之處,望能不吝指出!^_^
我的實現**:
view plain
/**author:花心龜
blog:
**/#include
#include
#include
using
namespace std;
void show_longest_seq(const multiset& myset)
else
if(counter > maxlength) //如果新數列長度大於maxlength
} curr_pos += myset.count(*set_it1); //計算第一層迴圈遍歷到的當前位置
if(myset.size()-curr_pos
break;
set_it1 = myset.upper_bound(*set_it1); //下一次set_it1 的位置,並跳過相同元素
} /*
列印最長等差數列
*/if(maxlength <= 2)
else
} //blog:
test in main
int main()
; multiset myset;
myset.insert(a,a+6);
show_longest_seq(myset);
cout<
int l;
srand((unsigned)time(null));
for(int j = 0; j
cout<
cout
return 0;
}
附一張測試結果圖:
最長等差數列 找數字 及最長等差數列分析
今日面試題 找數字 陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法,找到x。最長等差數列分析 原題給定未排序的陣列,請給出方法找到最長的等差數列。分析題目描述比較簡單,但是有乙個問題我們需要首先搞清楚 等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並...
最長等差數列 最長等差數列 及子串行分析
今日面試題 最長等差數列 給定未排序的陣列,請給出方法找到最長的等差數列。子串行分析 原題給定長度為n的整數數列 a0,a1,an 1,以及整數s。這個數列會有連續的子串行的整數總和大於s的,求這些數列中,最小的長度。分析如果只是像題目這樣的描述,沒有強調正數,可以採用o n 2 的方法。但是,很多...
求最長等差數列
給定未排序的陣列,請給出方法找到最長的等差數列。分析題目描述比較簡單,但是有乙個問題我們需要首先搞清楚 等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並沒有說明,這個就需要大家在面試的過程中和面試官進行交流。我們在這裡對兩種情況都進行討論 保證數字的順序 等差數列是要求相鄰兩個元素之間的差...