在乙個陣列a中尋找乙個最大的子陣列,這個問題可以用分治策略來求解。
首先需要劃分問題,最大的子陣列只有如下3中情況:
情況1:最大子串行出現在a[low]~a[mid]
情況2:最大子串行出現在a[mid+1]~a[high]
情況3:最大子串行包含a[mid],a[mid+1]
那麼,問題的計算就可以分為對兩個小的子串行求解,在加上乙個複雜度為n的方法,那麼整個問題的複雜度為nlgn
package maxsubarr
import(
"math"
)//findmaximumsubarray 尋找最大子串行
func findmaximumsubarray(a int, low, high int) (arrlow, arrhigh, arrsum int)
mid := (low + high) / 2
//只有3種情況
//情況1:最大子串行出現在a[low]~a[mid]
//情況2:最大子串行出現在a[mid+1]~a[high]
//情況3:最大子串行包含a[mid],a[mid+1]
leftlow, lefthigh, leftsum := findmaximumsubarray(a, low, mid)
rightlow, righthigh, rightsum := findmaximumsubarray(a, mid + 1, high)
corsslow, corsshigh, corsssum := findmaximumcorsssubarray(a, low, mid, high)
if leftsum >= rightsum && leftsum >= corsssum else if rightsum >= leftsum && rightsum >= corsssum
return corsslow, corsshigh, corsssum
}func findmaximumcorsssubarray(a int, low, mid, high int) (arrlow, arrhigh, arrsum int)
}rightsum := math.minint64
sum = 0
for i := mid + 1; i <= high; i++
}
return arrlow, arrhigh, leftsum + rightsum
}
最大子陣列問題
顧名思義,最大子陣列問題是求乙個陣列array中 和最大的非空連續子陣列 這樣的連續子陣列我們叫做最大子陣列,它的應用也有 很多,比如說找出時間序列中兩個時間節點使得這兩個時間節點對應的值的落差最大,如下圖 對於這類問題,通過求原始時間序列的一階差分得到序列array,此時求得array的最大子陣列...
最大子陣列問題
include include include typedef struct num num extern void displayarray const int a,const int n 顯示陣列元素值 extern void buildarray int a,const int n 陣列元素賦...
最大子陣列問題
每週堅持搞三種演算法問題,介紹一下最大子陣列問題 演算法思路 分治策略求解,將問題不斷分為更小的問題,進而求解 問題描述 求陣列中相連著的數 相加值最大,例如 輸出最大為2 3 4 21 22 define crt secure no warnigns include include include...