找出陣列中長度最長的等差數列

2021-06-23 09:25:11 字數 2255 閱讀 2849

t1:

求出乙個有序陣列中公差為d的最長等差數列。

較簡單動態規劃:

設等差數列的起始下標為s,當前下標為i,從s到i,構成的最長的等差數列長度為f(s,i),有

f(s,i+1) = f(s,i) +1 ( input[i+1] == input[s] + f(s,i)*d)

f(s,i)    ( input[i+1] != input[s] + f(s,i)*d)

最長的數列長度為:

maxlen = max

演算法時間複雜度應為n的平方,空間複雜度可優化至o(1) (**中為o(n))

**如下:

#include #include #define max 1000

void getseq(int *input, int size, int d);

int startindex = 0;

int maxlen = 0;

int maxlenstartindex = -1;

for(;startindex < size-maxlen; startindex++)

}else if(input[i] > input[startindex] + result[i-1]*d)

break;}}

printf("max sequence start index: %d, length: %d \n", maxlenstartindex, maxlen);

}int main();

getseq(input, sizeof(input)/sizeof(int), 3);

}

t2:求微軟面試題:求整數隨機數構成的陣列中找到長度大於=3的最長的等差數列

輸出等差數列由小到大: 

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

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

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

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

而本文要提另一種動態規劃解法,時間複雜度o(n^2),空間複雜度比較大,一會說。

方法:第一步都一樣,先排序。

第二步,動態規劃。在乙個已排好序的數列中,等差數列的差d滿足 0 <= d <= a[n-1] - a[0]。於是,設乙個二維表dp,有a[n-1] - a[0] + 1 行,n列,dp[i][j]記錄數列a[j],公差為i下的最長數列長度。那麼很明顯有:dp[i][j] = dp[i][  index_of( a[j] + i )  ] + 1。其中index_of(num)表示數num在陣列a中的索引。上述dp的意思是:如果a[j]能構成等差數列的乙份子,公差為i,那麼它的下一項就是a[j] + i,這當然要求a[j] + i存在於陣列a中啦~而且,a[j]構成的數列的長度就是由 a[j] + i 構成數列長度加1. 依據上述分析,只要對陣列a由尾到頭遍歷,對每個a[j],求出所有公差從0到a[n-1]-a[0]下的最長數列長度,則問題就得解了。

注意幾個問題:

1. 上述分析過程中要求求出所有公差從0到a[n-1]-a[0],但實際上並不需要這麼乙個乙個的求,因為以任何a[j],它能構成等差數列,則公差一定是 a[  k ] - a[ j ],這裡 j < k < n,因此,求解的範圍得到縮小,因此整體的時間複雜度為0(n^2)。

2. 另乙個實現問題是,dp只記錄了最長數列的長度,而我們為了能回朔並輸出等差數列,我們還需要知道構成最長等差數列a[j]的下乙個數是什麼,因此,需要同時記錄下一跳的索引。在**中,我用pair來記錄,first記錄長度,second記錄下一跳索引。

3. 注意處理a[j]與多個數差值相同的情況,比如 1,3,3,對a[0]=1,它和a[1],a[2]的差值相同,所以對於a[0],公差為2而言,即dp[2][0],它只需要更新一次即可。

#include "stdafx.h"  

#include #include using namespace std;

const int n = 10;

const int invalid_idx = -1;

void show(int* a,int n)

} }

if( maxlen > 1 )

cout<}

else

for (int i=0;idelete dp[i];

delete dp;

} int main(void)

; longest_seq(a);

return 0;

}

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

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

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

今日面試題 最長等差數列 給定未排序的陣列,請給出方法找到最長的等差數列。子串行分析 原題給定長度為n的整數數列 a0,a1,an 1,以及整數s。這個數列會有連續的子串行的整數總和大於s的,求這些數列中,最小的長度。分析如果只是像題目這樣的描述,沒有強調正數,可以採用o n 2 的方法。但是,很多...

求最長等差數列

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