最大子陣列問題(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-最大子陣列陣列
- 一道題把我氣笑了:) 力扣.53 最大子陣列和 leetcode maximum-subarray力扣陣列LeetCode
- 最大子列和問題
- LeetCode | 152. Maximum Product SubarrayLeetCode
- 【Lintcode】191. Maximum Product Subarray
- POJ3468 A Simple Problem with Integers---樹狀陣列(區間問題)陣列
- [LeetCode] 2419. Longest Subarray With Maximum Bitwise ANDLeetCode
- 二進位制陣列 subarray() 方法陣列
- 53. 最大子陣列和陣列
- 【DP】乘積最大子陣列陣列
- 求二維陣列中最大子陣列的和陣列
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- [LeetCode] 2841. Maximum Sum of Almost Unique SubarrayLeetCode
- [Python手撕]最大子陣列和Python陣列
- LeetCode53. 最大子陣列和LeetCode陣列
- php陣列問題PHP陣列
- 【力扣】最大子陣列和(貪心)力扣陣列
- LeetCode-152-乘積最大子陣列LeetCode陣列
- 【Leetcode】152.乘積最大子陣列LeetCode陣列
- leetcode題解(陣列問題)LeetCode陣列
- 《程式設計珠璣》程式碼之路11:最大子陣列和問題,花式七種解法程式設計陣列
- js陣列全排列問題JS陣列
- Python陣列中求和問題Python陣列
- 最大連續子陣列和(最大子段和)陣列
- 【leetcode】53. Maximum Subarray 連續子序列的最大和LeetCode
- 求最大子序列的問題
- Phantom Problem(幻讀)問題
- 子陣列異或和問題陣列
- 陣列效能問題分析總結陣列
- 陣列累加和問題三連陣列
- vue 陣列和物件渲染問題Vue陣列物件
- #1502 : 最大子矩陣矩陣
- JS中的陣列複製問題JS陣列
- 陣列(引用型別)複製問題陣列型別
- 陣列和列表的轉換問題陣列
- C++陣列預設初值問題C++陣列
- 53、最大子陣列和 | 演算法(leetcode,附思維導圖 + 全部解法)300題陣列演算法LeetCode
- JS陣列遍歷和獲取陣列最值JS陣列