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