最長等差數列就是在乙個陣列中,組成等差數列的最長的那乙個,首先我們對陣列排序,然後我們一般會先想到暴力法從第乙個開始迴圈遍歷整個陣列,時間複雜度o(n^3),下面給出偽**
int i,j,k,len = 0
for(i = 0; i < n; i++)
for(j = i+1; j < n; j++)
}求出最大的len
}
第二種方法用動態規劃,我們可以利用等差數列的性質來做,當等差數列長度為奇數的時候,比如相鄰3個數,aiajak
則2*aj = ai+ak;只要任何乙個關於它對稱的兩個數相加都等於它的2倍,有了這個性質我們就可以利用動態規劃來做
dp[i][j] = d,表示以a[i]a[j]為前兩個元素的等差數列長度為d,我們再來推狀態轉移方程,
如果ai+ak<2*aj,說明ak - aj < aj - ai dp[i][j]的值不能確定,k接著往後走
如果ai+ak>2*aj,說明ak-aj > aj -ai,此時dp[i][j]的值為2,因為k不能往後走了,再往後走二者差距更大,所以a[i]a[j]開頭的等差數列為2,然後再i--,開始尋找下個ai aj開頭的等差數列
如果ai+ak==2*aj,則說明這三個數構成等差數列,此時dp[i][j]=dp[j][k]+1;也就是說以ajak開頭的等差數列前加上了乙個ai,狀態轉移確定好後,下面開始寫**
#include #include #include struct result
;int max(int a,int b)
void find_llap(int *arry,int n)
if(n < 2)
result.max_len = 0;
for(j = n-1; j >= 1; j--)
else if(arry[i]+arry[k] < arry[j]<<1)
}int delta = arry[result.j] - arry[result.i];
int last = arry[result.i]+(result.max_len-1)*delta;
for(i = arry[result.i]; i <= last; i+=delta)
printf("%d ",i);
}int main()
依據這個性質,還有一種動態規劃,dp[i][j]代表等差數列最後兩個元素,然後從前往後遍歷,得到的結果一樣
尋找最長的等差數列
問題描述 給定乙個大小為n的陣列,要求寫出乙個演算法,求出其最長的等差數列的子串行。首先問題並沒有要求要按照原來陣列的順序,所以可以先對該陣列排序。如果不要求該最長子序列中的元素是相鄰的話,可以用乙個簡單的dp來完成。令 f i j 表示以 i 為結尾的某子串行 該子串行的等差為 j 的最大長度 那...
尋找最長的等差數列
題目描述 description 給定n 1 n 100 個數,從中找出盡可能多的數使得他們能夠組成乙個等差數列.求最長的等差數列的長度.輸入描述 input description 第一行是乙個整數n,接下來一行包括了n個數,每個數的絕對值不超過10000000.輸出描述 output descr...
最長等差數列 找數字 及最長等差數列分析
今日面試題 找數字 陣列a中,除了某乙個數字x之外,其他數字都出現了三次,而x出現了一次。請給出最快的方法,找到x。最長等差數列分析 原題給定未排序的陣列,請給出方法找到最長的等差數列。分析題目描述比較簡單,但是有乙個問題我們需要首先搞清楚 等差數列中的數字,是否要和原始陣列中的順序一致。題目中,並...