也是最簡單的解法,時間複雜度為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 }
測試如下,三個不同的序列
1public
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 遍歷一...