7 給定n個序列,求相鄰的k個數之和為最大

2022-02-12 11:11:33 字數 2279 閱讀 1819

1、問題描述:給定

n個數,求相鄰的

k個數之和為最大。要求給出複雜度較小的一種演算法

再解決這個問題前,先了解一下類似的常見問題。

2、給定一串數字(可正可負的

int,放在陣列

num裡),要求找到起始位置

start

和終止位置

end,使得從

start

位置到end

位置的所有數字之和最大,返回這個最大值

max。

演算法思想:用動態規劃演算法實現。

設 imaxsum

為以 inumpar

[i]終止且包含

inumpar

[i]的最大序列的和,有:

imaxsum  = 

inumpar

[0];

imaxsum  =  imaxsum > 0 ? imaxsum +

inumpar

[i+1] :

inumpar

[i+1];

其中,i = 0,1,...

那麼和imaxsum

就是 inumpar

[0] ...

inumpar

[n] 中最大的乙個序列。

演算法的時間複雜度為o(n)

。示例**

#include using namespace std;

void findthemaxsum(int inumpar, const int isize, int &ibegin, int &iend, int &imaxsum)

else

if (itemsum > imaxsum) //更新結果

}}int main()

; icount = sizeof(inum)/sizeof(inum[0]);

findthemaxsum(inum, icount, ibegin, iend, iresult);

cout << ibegin <<" "<< iend <<" "<< iresult <

3、最容易想到的就是窮舉搜尋。在

n個序列中求出每

k個連續序列的值,進行比較。

示例**

#include using namespace std;

void findthemaxksum(int inumpar, const int isize, int ik, int &ibegin, int &iend, int &imaxsum)

imaxsum = itemmaxksum;

int istart = ibegin = 0, iover = iend = ik - 1;

for (int i = 1; (i < isize) && ((isize - i) >= ik); ++i)

if (itemmaxksum > imaxsum)

}}int main()

; icount = sizeof(inum)/sizeof(inum[0]);

findthemaxksum(inum, icount, 3, ibegin, iend, iresult);

cout << ibegin <<" "<< iend <<" "<< iresult <

由上可見,複雜度為o(ik + n*k)

。那麼有沒有更好的方法呢?優化的方法就是把迴圈體內的相加迴圈去掉。

示例**

#include using namespace std;

void findthemaxksum(int inumpar, const int isize, int ik, int &ibegin, int &iend, int &imaxsum)

int istart = ibegin = 0;

ibegin = 0;

iend = ik - 1;

imaxsum = ptempsum[iend];

for (int i = 1, j = ik; j < isize; ++i, ++j) }

delete ptempsum;

}int main()

; icount = sizeof(inum)/sizeof(inum[0]);

findthemaxksum(inum, icount, 3, ibegin, iend, iresult);

cout << ibegin <<" "<< iend <<" "<< iresult <

由上可見,程式複雜度為o(n),n

為問題規模。

參考[1]更多的數學說明:

[2]csdn論壇中的討論

給定N個數,確定第K個最大值

選擇問題 給定n個組,確定第k個最大值 稍微好一點的演算法可以先把前k個元素讀人陣列並 以遞減的順序 對其排序。接著,將剩下的元素再逐個讀人。當新元素被讀到時,如果它小於陣列中的第個元素則忽略,否則就將其放到陣列中正確的位置上,同時將陣列中的乙個元素擠出陣列。當演算法終止時,位於第k個位置上的元素作...

求n 中因子k的個數

思路 求n的階乘某個因子k的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n 超出了資料的表示範圍,這種直接求的方法肯定行不通。其實n 可以表示成統一的方式。n km m a 其中k是該因子,m n k,a是不含因子k的數的乘積 下面推導這個公式 n n n 1 n 2 3 2 1 k 2...

N個數中的前k個

題目描述 n個數,列印出重複次數最多的前十個 方法 無序容器 優先順序佇列 資料結構 雜湊單重對映表 優先順序佇列 步驟 1 遍歷所有的數,放進雜湊表中 2 找到前十個重複率最高的 3 列印 include include include include include includeusing n...