和最大的連續子串

2021-06-09 22:49:18 字數 1105 閱讀 8404

給定一整型數字a=,找出連續子串,使得和最大,其中,0<=x<=y<=n。要求時間複雜度為o(n)。

解決思路:

和最大的子串一定是以陣列a中的某乙個元素為結束,所以我們分別對每乙個元素作為當前子串的結尾計算當前和最大的子串,再對計算出的所有子串和進行比較,最大的那個就是解。

計算以元素a(i+1)結尾的和最大的子串:假定以a(i)結尾的和最大子串為l[i],和為sum[i],則當sum[i]+a[i+1]>a[i+1],那l[i+1]為l[i]加上a[i+1],sum[i+1]=sum[i]+a[i+1];否則l[i+1]為a[i],sum[i+1]=a[i+1];為什麼這樣?注意「連續」,也就是說以a[i+1]結尾的子串必定包含a[i+1],那和最大的子串l[i+1]只能是a[i+1]或者l[i]加上a[i+1],顯然,sum[i]+a[i+1]>a[i+1]則不取a[i+1]而 取l[i]加上a[i+1],否則就取a[i+1];

原因連續則必定以a[i+1]結尾,而以a[i+1]結尾的和最

大的子串要麼是a[i+1],要麼是l[i]+a[i+1],可以通過sum[i]和a[i+1]的符號來檢查這個結論

**如下:

struct submax//最大和的子串

;submax maxsub(int a,int size)

sub[0][0]=0;

sub[0][1]=0;

sub[0][2]=a[0];

for(int i=0;i

else  }

int max_sub=0;

int maxsubsum=0;

for(int j=0;j  }

submax s;

s.start=sub[max_sub][0];

s.end=sub[max_sub][1];

s.sum=sub[max_sub][2];

for(int m=0;m

return s;

}int main()

; submax s=maxsub(a,12);

cout<<"連續子串最大的和:"<

for(int i=s.start;i<=s.end;i++)

cout<

}

1003 最大連續子串和

乙個經典問題,對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。這裡我們需要注意子串和子串行之間的區別。子串是指數組中連續的若干個元素,而子串行只要求各元素的順序與其在陣列中一致,而沒有連續的...

最大和連續子串

輸入一組整數,求出這個整數陣列最大和的連續 子串。例如,整數陣列為,最大和的連續子串為,最大和為61。需要注意的是要求子串連續,另外,子串的長度可以是1.這個也是曾經出過的一道面試提,最早是浙大的一道考研演算法設計題。第一種方法。最簡單的思路就是用兩層迴圈來解決問題。外面一層是從1到整數陣列的長度,...

最大乘積連續子串

輸入一組浮點數,求出這個浮點陣列最大乘積的連續子串。舉個例子,浮點陣列為str 這時得出來的結果是前兩個浮點數的乘積,即15。需要注意的是,這個子串是要求連續的,另外,子串的長度可以為1.這裡給出兩種思路,後續可能還會加入新的思路。第一種是直接求解。即用雙層迴圈。外面一層是從1到浮點陣列的長度,裡面...