演算法 最大子串行和問題

2022-09-18 23:09:09 字數 1724 閱讀 5832

也是最簡單的解法,時間複雜度為o(n^2)

1

//o(n^2)2//

直接簡單粗暴

3public

void solution1(int

ints) 12}

13}14system.out.println(maxsum);

15 }

分治法,利用遞迴的思想,將問題不斷分解為最小段。在本例中,最大序列可能出現在左半段、右半段以及中間部分:將序列不斷分解。在某一層級中,求出左子段和右字段最大值後,中間部分在分別向兩個求出最大值相加,最後比較三個部分的最大值。時間複雜度為o(nlogn)

1

//都為閉區間2//

分治法3

//o(nlogn)4/*

5t(n)=2t(n/2)+n;

6t(1)=1;

7t(2)=4;

8t(4)=32;

9t(n)=o(nlog(n));

10*/

11public

int solution2(int ints,int start,int

end)

16int

maxleft;

17int

maxright;

18int splitindex = (start + end) / 2;

19//

左半邊20 maxleft = solution2(ints,0,splitindex);

21//

右半邊22 maxright = solution2(ints,splitindex + 1,end);

23//

中間24

int sumleft =ints[splitindex];

25int sumright = ints[splitindex + 1];

26//

向左求包含最後乙個的最大和

27int sum = 0;

28for (int i = splitindex; i >= start; i--)

32//

向右求包含第乙個的最大和

33int sum1 = 0;

34for (int i = splitindex + 1; i <= end; i++)

3839

return math.max(sumleft +sumright,math.max(maxleft,maxright));

40 }

數學分析法。時間複雜度為o(n)

1

//最大前n項和-最小前k項和=最大子串行和2//

o(n)

3public

void solution3(int

ints)

12system.out.println(maxsum);

13 }

測試如下,三個不同的序列

1

public

void

test01() ;

3int ints = ;4//

int ints = ;

5solution1(ints);

6 system.out.println(solution2(ints, 0, ints.length-1));

7solution3(ints);

8 }

最大子串行求和 絕妙的演算法 最大子串行和問題

問題的引入 給定 可能有負數 整數序列a1,a2,a3.an,求這個序列中子序列和的最大值。為方便起見,如果所有整數均為負數,則最大子串行和為0 例如 輸入整數序列 2,11,8,4,1,16,5,0,則輸出答案為35,即從a2 a6。這個問題之所以有吸引力,主要是因為存在求解它的很多演算法,而這些...

最大子串行和演算法

include stdio.h 演算法1 int maxsubsequencesum1 const int a,int n int thissum,maxsum,i,j,k maxsum 0 for i 0 i n i for j i j n j thissum 0 for k i k j k th...

最大子串行和演算法

題目 求a i 中和最大的子串行。時間複雜度o nlogn 使用分治 遞迴的方法。分別求出左邊n 2長度的最大子串行和 右邊n 2長度的最打字序列和 以及橫跨這兩部分且通過中間的最大和 要分別求出兩邊帶有最中間邊界的最子大序列和,將其相加 由於不是最簡單的方法,這裡不再贅述。時間複雜度o n 遍歷一...