微軟面試題4 (最長等差數列)

2021-05-27 17:45:45 字數 1708 閱讀 4034

題:求隨機數構成的陣列中找到長度大於=3的最長的等差數列

輸出等差數列由小到大: 

如果沒有符合條件的就輸出[0,0]

格式:輸入[1,3,0,5,-1,6]

輸出[-1,1,3,5]

要求時間複雜度,空間複雜度盡量小

分析

基本演算法思路(採用動態規劃思想):首先,只要得到數列的公差和乙個首項就可以確定乙個等差數列,因此我們要尋找最長等差數列的公差以及首項。其次,為了方便查詢公差和首項,我們應該將原陣列進行由小到大排序,這樣各兩數之間的公差也是成遞增形勢的,這樣我們就可以避免回溯查詢首項

因此,在搜尋公差及首項的過程中,我們可以分兩三個決策階段:

1、如果公差為0,應該做何處理。

2、如果公差不為0,應該做何處理。

3、如果找到的數列長度是當前最長的做相應的處理

針對以上情況,我們應該選擇一種合適的資料結構——平衡排序樹,stl中的set,map,mutiset,multimap是以紅黑樹結構為形勢的容器,無疑是非常合適的,根據題目情況,可能存在具有相同元素的陣列,因此我們選擇multiset,這樣無論我們對資料進行插入排序,查詢都是比較高效的,因此總體上是可以滿意的。

最後有幾項時間上的優化不在這裡說明,詳情可看**。若有不足之處,望能不吝指出!^_^

我的實現**:

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 的方法。但是,很多...

求最長等差數列

給定未排序的陣列,請給出方法找到最長的等差數列。分析題目描述比較簡單,但是有乙個問題我們需要首先搞清楚 等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並沒有說明,這個就需要大家在面試的過程中和面試官進行交流。我們在這裡對兩種情況都進行討論 保證數字的順序 等差數列是要求相鄰兩個元素之間的差...