最大子陣列問題(Maximum subarray problem)
參考:Wikipedia
最大子陣列問題就是在一個一維的陣列中找到和最大的一個連續的子陣列。給定的陣列一般包括正數負數和0。
這個問題的一些屬性如下:
1. 如果陣列內的所有元素非正,那麼問題的解就是其中最大的一個元素。
2. 如果陣列內所有的元素非負,那麼問題的解就是所有元素之和。
3. 空的集合是無效的。
4. 可以有多個子集能得到最大和。
解決這類問題的方法包含以下幾種:暴力求解,分治策略,動態規劃。
分治策略(Divide and Conquer)
原理:將陣列分成前後兩個部分,A[lo,hi]的任意連續子陣列可以分成以下三種情況
1. 完全位於子陣列A[lo,mi]之間。
2. 完全位於子陣列A[mi+1,mi]之間。
3. 跨越了中點mi。
這樣我們只需要找出兩邊的子陣列,並按照一定規則合併即可。
Kandane's algorithm
原理:令以i位置為末尾的子陣列中的最大和子陣列為B(i),則B(i+1)=max(A(i+1),A(i+1)+B(i)),其中A(i+1)是i+1處的元素。
依據遞推公式我們可以得到以下程式碼。
def max_subarray(A):
max_ending_here = max_so_far = A[0]
for x in A[1:]:
max_ending_here = max(x, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
相關文章
- 53_Maximum Subarray-最大子陣列陣列
- Maximum Subarray 連續子陣列最大和陣列
- 一道題把我氣笑了:) 力扣.53 最大子陣列和 leetcode maximum-subarray力扣陣列LeetCode
- 最大子陣列和問題的解陣列
- [LeetCode] Maximum Product Subarray 求連續子陣列的最大乘積LeetCode陣列
- Leetcode Maximum SubarrayLeetCode
- 陣列1——求一個陣列的最大子陣列陣列
- Leetcode Maximum Product SubarrayLeetCode
- Leetcode-Maximum SubarrayLeetCode
- Maximum Subarray leetcode javaLeetCodeJava
- POJ3468 A Simple Problem with Integers---樹狀陣列(區間問題)陣列
- 【DP】乘積最大子陣列陣列
- 53. 最大子陣列和陣列
- 二進位制陣列 subarray() 方法陣列
- 求二維陣列中最大子陣列的和陣列
- LintCode-Maximum Subarray II
- LintCode-Maximum Subarray III
- LintCode-Maximum Subarray Difference
- Leetcode-Maximum Product SubarrayLeetCode
- 迴圈陣列最大子段和陣列
- [leetCode][001] Maximum Product SubarrayLeetCode
- php陣列問題PHP陣列
- 【力扣】最大子陣列和(貪心)力扣陣列
- [Python手撕]最大子陣列和Python陣列
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- 【Lintcode】191. Maximum Product Subarray
- LeetCode | 152. Maximum Product SubarrayLeetCode
- 《程式設計珠璣》程式碼之路11:最大子陣列和問題,花式七種解法程式設計陣列
- POJ 3693 Maximum repetition substring(字尾陣列求最長重複子串)陣列
- 求最大子陣列(貪心演算法)陣列演算法
- LeetCode53. 最大子陣列和LeetCode陣列
- 金幣陣列問題陣列
- java陣列的問題Java陣列
- 面試題:陣列按列排序的問題面試題陣列排序
- LeetCode-Maximum Size Subarray Sum Equals kLeetCode
- [LeetCode] 2419. Longest Subarray With Maximum Bitwise ANDLeetCode
- CF22B 最大子矩陣問題簡單版矩陣
- 最大連續子陣列和(最大子段和)陣列