給定未排序的陣列,請給出方法找到最長的等差數列。
分析題目描述比較簡單,但是有乙個問題我們需要首先搞清楚:等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並沒有說明,這個就需要大家在面試的過程中和面試官進行交流。我們在這裡對兩種情況都進行討論
保證數字的順序
等差數列是要求相鄰兩個元素之間的差是相同的。那我們可以記錄下來陣列中任意兩個數的差,並且記錄下來。對於陣列a,記錄a[j]-a[i],其中 i構造hashmap如下:
上面已經排好序,對於第乙個,找到等差數列0,1,2對應數字誒5,4,3.第二個,3和4位置沒有連起來,不夠成等差數列。方法平均時間複雜度為o(n^2),空間複雜度為o(n^2).
無需保證數字的順序
不需要保證數字的順序與原來陣列一致,如何找到最長的等差數列呢?原來的陣列是無序的,我們先對陣列進行排序,最終的一定是排序之後序列的子串行。然後,我們採用動態規劃的方法解決這個問題。
我們假設dp[i][j]表示以a[i]a[j]開始的數列的長度,dp[i][j]如何表示呢?dp[i][j]=dp[j][k]+1,當 a[j]-a[i]=a[k]-a[j],及a[k]+a[i]=2*a[j]。根據dp[i][j]的定義,我們知道dp[x][n-1]=2,也就是 最後一列是2,數列只有a[x]和a[n-1]兩個元素。首先,j從n-2,開始向前遍歷,對於每乙個,找到i和k,滿足 a[k]+a[i]=2*a[j],則有dp[i][j]=dp[j][k]+1,若沒有,則dp[i][j]就為2.
這裡找i和k,有乙個小技巧,如下:初始i=j-1,k=j+1,然後分別向兩邊遍歷,如果a[k]+a[i]2*a[j]則i--。大家還是參考**吧:
【分析完畢】
其實,兩種情況最終都是求最長的等差序列,只是第一種情況是在無序的序列中求,第二種情況是在遞增的序列中求。
所以,第二種情況比第一種情況的資料更嚴格,理論上演算法也可以更優。實際上卻確實如此。
第一種情況給出的解法,作者雖說「方法平均時間複雜度為o(n^2),空間複雜度為o(n^2).」,但是時間複雜度為o(n^2)還是值得商榷的(如果再增加空間複雜度,就沒有異議了)。
第二種情況給出的解法,時間複雜度為o(n^2),空間複雜度為o(n^2),沒有異議,而且很很巧妙,利用了遞增的性質。另外,@曹鵬博士 推薦了一篇** 據說時間複雜度可以更小一些。
最長等差數列 找數字 及最長等差數列分析
今日面試題 找數字 陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法,找到x。最長等差數列分析 原題給定未排序的陣列,請給出方法找到最長的等差數列。分析題目描述比較簡單,但是有乙個問題我們需要首先搞清楚 等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並...
最長等差數列 最長等差數列 及子串行分析
今日面試題 最長等差數列 給定未排序的陣列,請給出方法找到最長的等差數列。子串行分析 原題給定長度為n的整數數列 a0,a1,an 1,以及整數s。這個數列會有連續的子串行的整數總和大於s的,求這些數列中,最小的長度。分析如果只是像題目這樣的描述,沒有強調正數,可以採用o n 2 的方法。但是,很多...
最長等差數列分析
摘要 給定未排序的陣列,請給出方法找到最長的等差數列。分析 題目描述比較簡單,我們需要首先搞清楚 題目中要求的等差數列中的數字,是否要和原始陣列中的順序一致。我們在這裡分兩種情討論保證數字的順序 要求等差數列,第一 首先可以記錄下來陣列中任意兩個數的差。對於陣列a,記錄a j a i 其中 i第 二...