怎麼求出乙個陣列最大的連續累加之和呢?方法有很多,我們目前只講乙個比較不錯的方法,該方法使用了分治遞迴的思想。
我們假設下面是我們需要計算的陣列,其中a是游標,我可以知道游標將陣列分成了兩段,最大值有可能出現在前半段也有可能出現在後半段,還有一種情況是跨越a(中間)相加的一段。
[1,-3,5,7 a,9,-8,6,2]
跨越a相加的部分我們可以這樣計算:
int maxleftbordersum =0;
int leftbordersum =0;
for (int i = center;i >= left;i--)
}int maxrightbordersum =0;
int rightboedersum =0;
for (int i = center +1;i <= right;i++)
}
以中間為起點向兩邊相加,然後將左右兩邊最大和相加:maxleftbordersum+maxrightbordersum,即可得跨越a相加最大的。
前後端最大值可以通過遞迴求得:
int center = (left + right)/2;
int maxleftsum =maxsumrec(array,left,center);
int maxrightsum =maxsumrec(array,center+1,right);
最後我們分析一下這個遞迴方法的基準方法:
if (left == right)else
}
因此完整的程式是:
public static void main(string args)throws exception ;
system.out.println("結果:"+maxsumrec(array,0,array.length-1));
}public static int maxsumrec(int array,int left,int right)else
}int center = (left + right)/2;
int maxleftsum =maxsumrec(array,left,center);
int maxrightsum =maxsumrec(array,center+1,right);
int maxleftbordersum =0;
int leftbordersum =0;
for (int i = center;i >= left;i--)
}int maxrightbordersum =0;
int rightboedersum =0;
for (int i = center +1;i <= right;i++)
}return max(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);
}public static int max(int v1,int v2,int v3)else
}
最後返回三者的最大值即可求得。
這種演算法算是效率比較高的,但是根據合成效益法則可知,這個演算法仍然有重複計算的部分。
下面說的這種算是則不會出現這種情況,只會對陣列進行一次掃瞄。
public static void main(string args) throws exception ;
system.out.println("結果:"+maxsubsum(array));
}public static int maxsubsum(int array) else if (thissum<0)
}return maxsum;
}
這種演算法是僅需要常量空間並以線性時間執行的聯機演算法。 最大子串行和問題求解
基本思想 窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。演算法步驟 1.第一層迴圈從0到n 1,確定子串行的開始位置 2.第二層迴圈從第一層迴圈變數開始到n 1,確定子串行的結束位置 3.第三層迴圈從第一層迴圈變數開始到第二層迴圈變數結束,計算這個子串行的和,並與最大子串行和比較,如果大於最...
求解最大子串行和問題
原題 給定乙個陣列,其中元素有正,也有負,找出其中乙個連續子串行,使和最大 不想說明什麼,我們資料結構老師第一節課就給我們講這個,以前給實現過乙個暴力演算法版的演算法複雜度 o n2 現在實現乙個動態規劃版的 求解最大子串行和問題o n 演算法 param array public static v...
最大子串行和問題的求解
問題描述 給定 可能存在負值 整數a1,a 2.a n,求最大子串行和。如果所有的整數均為負數,則最大子串行和為0.列如 對於輸入 2,11,4,13,5,2,該輸入的最大子串行和為20 11 4 13 現在我們將敘述四個演算法來求解最大子串行和問題。1.該演算法是使用窮舉法來嘗試所有的可能 演算法...