最長等差數列 最長等差數列 及子串行分析

2021-10-16 18:02:55 字數 1120 閱讀 7667

今日面試題:最長等差數列

給定未排序的陣列,請給出方法找到最長的等差數列。

子串行分析

原題給定長度為n的整數數列:a0,a1,..,an-1,以及整數s。這個數列會有連續的子串行的整數總和大於s的,求這些數列中,最小的長度。

分析如果只是像題目這樣的描述,沒有強調正數,可以採用o(n^2)的方法。但是,很多同學在討論的時候,指出了如果是正數,解法將會有什麼樣的變化。這個很好。不考慮正負的o(n^2)的方法,這裡不詳細說了,我們來討論,當數列中都是正數的情況。

介紹乙個利用排序+二分的方法。對於子串行ai...at,子串行和s=ai+...+at=sum[t]-sum[i-1]。sum[t]表示數列a0...at的和。那麼,陣列sum天然就是遞增的,可以進行二分查詢。 那麼如何進行二分查詢呢?對於陣列sum,遍歷找到第乙個k,sum[k]>s,二分查詢k前面的某乙個j,j是sum[k]-sum[j]>s裡最大的乙個,則k-j是最小的。依次遍歷完陣列。 可以得到最小的長度,整體的時間複雜度o(nlogn),空間複雜度為o(n)。

是否有更快的方法呢?從以上兩個方法,我們可以有如下的觀察:

a0...at>s,則a0...at+1無需再考慮

對於a0...at>s,只需嘗試a1...at是否》s,如果大於s,則更新最短長度。

如果不大於s,大於s的只可能是a1...atat+1等。

鑑於以上的觀察,我們有如下的演算法:設定索引i,j指向第乙個整數:

1. ++j,直到sum[j]-sum[i]>s,這裡不需要額外儲存sum,為了方便說明。記錄子串行長度

2. ++i,如果sum[j]-sum[i]>s,更新最小子序列長度。直到sum[j]-sum[i]<=s。

3. ++j,直到sum[j]-sum[i]>s。重複上面的兩步,直到陣列遍歷完畢。

整個演算法的時間複雜度為o(n)。下面我們做乙個示例陣列為,s=10,i=j=0開始

1. 當j=3時,和為14>10,則更新最小長度為4

2. 對i進行遞增操作,和為9<10,不滿足條件。對j進行遞增

3. 當i=1,j=4時,和為19>10,長度為4,不更新最小長度。遞增i,直到i=3,此時和15>10,更新最小長度為2,

4. 依次類推

最終得到最小長度為2.

【分析完畢】

最長等差數列 找數字 及最長等差數列分析

今日面試題 找數字 陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法,找到x。最長等差數列分析 原題給定未排序的陣列,請給出方法找到最長的等差數列。分析題目描述比較簡單,但是有乙個問題我們需要首先搞清楚 等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並...

求最長等差數列

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

最長等差數列分析

摘要 給定未排序的陣列,請給出方法找到最長的等差數列。分析 題目描述比較簡單,我們需要首先搞清楚 題目中要求的等差數列中的數字,是否要和原始陣列中的順序一致。我們在這裡分兩種情討論保證數字的順序 要求等差數列,第一 首先可以記錄下來陣列中任意兩個數的差。對於陣列a,記錄a j a i 其中 i第 二...