方法一:舉例分析數組的規律數組
例如數組{1,-2,3,10,-4,7,2,-5}編碼
分析:循環遍歷數組,初始累加和爲0。第一步,和爲1.第二步,和爲-1;第三步,和小於0,若是用-1加上3,和爲2,小於3.那麼從第一個累加的和必然小於從3開始累加的和,所以放棄以前累加的和。從3重新開始,此時和爲3。第四步,和爲13;第五步,和爲9,小於原來的和,所以將以前獲得的和13保存下來,它有多是最大值。第五步,和爲16,大於13.將最大值替換爲16.依次類推。
spa
方法二:採用動態規劃法code
遍歷數組中的元素,逐個修改數組中到大當前元素的最大子數組和。blog
採用公式:f(i) = max{a[i], f(i-1)+a[i]}class
第一步:和爲1,元素值爲1;第二步:和爲-1,元素值爲-2,和大於當前值,故元素值修改成-1;第三步:和爲2,小於當前值,故房錢前面的和,將和修改成當前元素值;第四步:和爲12,元素值爲10,將元素值修改成12。以此類推。變量
package com.wyl; /** * 求數組的子數組中最大的和 * @author wyl */
public class SubArrayMax { /** * 方法一: * 分析數組的規律進行編碼,使用中間變量保存當前最大子數組和的值 * @param array * @return
*/
public int maxSubArray(int[] array){ if(array.length <= 0){ return 0; } int sum = 0; int max = 0; //遍歷數組,直到第一個不爲負數的數
for(int i=0;i<array.length;i++){ if(sum < 0){ //子數組之和小於當前值,表明當前值前面的子數組和要比從當前值開始加和要小
sum = array[i]; }else{ //加上當前值後的值比以前的值小,則保存當前和,有可能爲最大值
sum += array[i]; } if(sum > max){ max = sum; } } return max; } /** * 方法二: * 使用動態規劃法,求出逐個子元素的最小和 * f(i) = max{a[i], f(i-1)+a[i]} * 須要修改數組中元素的值 * @param args */
public int maxSubArray1(int[] array){ int sum = 0; for(int i=0;i<array.length;i++){ sum += array[i]; if(array[i] < sum){ //將當前值修改成當前子數組和的最大值
array[i] = sum; }else{ //子數組之和小於當前值,拋棄以前的sum,將當前值賦給sum
sum = array[i]; } } int max = 0 ; for (int a:array) {//獲得數組中的最大值 System.out.println(a); if(a > max){ max = a; } } return max; } public static void main(String[] args) { SubArrayMax subArrayMax = new SubArrayMax(); int[] array = {1,-2,3,10,-4,7,2,-5,-7,-16,22,13}; int max = subArrayMax.maxSubArray1(array); System.out.println("數組的最大子數組和爲:" + max); } }