程式設計之美2 14 求子陣列之和的最大值

2021-06-13 14:12:50 字數 1954 閱讀 6444

問題描述:乙個有n個整數元素的一維陣列(a[0]...a[n-1]),這個陣列當然有很多子陣列,那麼子陣列之和的最大值是多少呢?

思路一:最直接能想到的方法就是列舉,暴力解法,複雜度為o(n^2)。

思路二:遞迴解法,將陣列分成長度相等的兩段陣列,分別為a[0],...,a[n/2-1]和a[n/2],...,a[n-1],分別求出最大欄位和,原陣列的最大欄位和為以下三種情況之一:

1:a[0],..., a[n-1]的最大欄位和a[0],...,a[n/2-1]的最大字段相同

2:a[0],..., a[n-1]的最大欄位和a[n/2],...,a[n-1]]的最大字段相同

3:a[0],..., a[n-1]的最大字段跨過了中間兩個元素a[n/2-1]到a[n/2]。

這其實是一種分治演算法,複雜度為o(nlogn)

思路三:動態規劃思想,從a[n-1]算起到a[i]時候,最大的和在(nall表示a[n-1]到a[i+1]的子陣列最大值,nstart表示含a[i]的子陣列的最大值)中,故可以用動態規劃的

方法解決。

思路四:這種方法從動態規劃的思想想到的,很巧妙,從陣列一直累加求最大值,如果和大於0,則可以一直累加,如果和小於0了,就直接捨棄掉前面重新再求和。

詳見**如下:

#include #include #include using namespace std;

int maxsum_1(int *a, int n) // o(n^2),暴力解法

} return maximum;

}int maxsum_2(int * a, int low, int high) // o(nlogn),遞迴

} int maxrs, currs;

maxrs = currs = a[mid+1];

/* mid+1 <= high */

for (int j = mid + 2; j <= high; ++j)

}int maxmidsum = maxls + maxrs;

return max(max(maxleftsum, maxrightsum), maxmidsum);

}int maxsum_3(int *a, int n) // o(n),最簡單

return nall;

}//o(n),從a[n-1]算起到a[i]時候,最大的和在(nall表示a[n-1]到a[i+1]的子陣列最大值,nstart表示含a[i]的子陣列的最大值)中,故可以用動態規劃的方法解決。

int maxsum_4(int * a, int n)

return max;

}int main()

; cout << maxsum_1(a, sizeof(a)/sizeof(a[0])) << endl;

cout << maxsum_2(a, 0,sizeof(a)/sizeof(a[0])) << endl;

cout << maxsum_3(a, sizeof(a)/sizeof(a[0]))<< endl;

cout << maxsum_4(a, sizeof(a)/sizeof(a[0]))<< endl;

system("pause");

}

擴充套件思考題:

1.如果陣列首尾相連,請問使其和最大,怎麼辦?

2.如果題目要求同時返回最大陣列的位置,演算法應該如何改變,還能保持o(n)的時間複雜度麼?

解:對於第一題,明天再寫了,據說程式設計之美上的解答好像是有問題的,先附上鏈結

第二題的話,運用方法4,當max變化時候,可以記錄前後下標值,附上**如下:

int maxsum_4(int * a, int n, int& first, int& second)

if(sum > max)

}return max;

}

程式設計之美2 14求子陣列之和的最大值

分而治之的思想 divide and conquer includeusing namespace std int max int a,int b int maxsum int a,int low,int high includeusing namespace std int max int a,i...

2 14 求子陣列之和的最大值

include using namespace std int maxsum int src,int n,int spos,int epos else if start all return all int max int a,int b,int c else void toneg int src,...

程式設計之美2 14 求陣列的子陣列之和的最大值

問題描述 乙個有n個整數元素的一維陣列 a 0 a 1 a n 1 它包含很多子陣列,求子陣列之和的最大值,當陣列元素全部為負的時候,有兩種處理辦法,第一種是返回0,第二種是返回陣列中最大的負數。解法1 使用暴力法,假設最大的一段陣列為a i a j 則對i 0 n 1 j i n 1,遍歷一遍,求...