給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
使用分治法,a[low…high]的任意連續子陣列a[i…j]所處的位置必然是以下三種情況之一:
(a)完全位於子陣列a[low…mid]中,因此low≤i≤j≤mid
(b)完全位於子陣列a[mid+1…high]中,因此mid≤i≤j≤high
(c)跨越了中點,因此low≤i≤mid≤j≤high
分別找它們中的最大子陣列就好了
# 找跨過中點的
defcross
(a, low, mid, high)
: left_sum =
-65536
sum=
0 max_left = max_right =
0# 找左邊的最大陣列
i = mid
while i >= low:
sum+= a[i]
ifsum
> left_sum:
left_sum =
sum max_left = i
i-=1 right_sum =
-65536
sum=
0# sum重新置為0
# 找右邊的最大陣列
j = mid+
1while j <= high:
sum+= a[j]
ifsum
> right_sum:
right_sum =
sum max_right = j
j+=1return max_left,max_right,
(left_sum+right_sum)
# 找子陣列,返回值為改子陣列的 最小索引,最大索引,和
deffind_ma
(a, low, high)
:if low == high:
return low, high, a[low]
mid =
int(
(low+high)/2
) left_low, left_high, left_sum = find_ma(a, low, mid)
right_low, right_high, right_sum = find_ma(a, mid+
1, high)
cross_low, cross_high, cross_sum = cross(a, low, mid, high)
if left_sum > right_sum and left_sum > cross_sum:
return left_low, left_high, left_sum
elif left_sum < cross_sum and right_sum < cross_sum:
return cross_low, cross_high, cross_sum
else
:return right_low, right_high, right_sum
# 測試
arr =[1
,-1,
2,3,
-5,1
,-4]
a,b,c = find_ma(arr,0,
6)print
(a,b,c)
2 3 5
Java分治法實現最大子陣列
尋找陣列a的和最大的非空連續子陣列。例如 陣列 a 的和最大的連續子陣列為,最大和為43,所以就是a的最大子陣列 陣列的最大子陣列為。採用分治策略 將陣列分為兩個規模相等的子陣列,分別求子陣列的最大子陣列,以及跨越中點的最大子陣列,然後將左子陣列 右子陣列 跨越中點三種情況的最大子陣列比較取最大值。...
C 最大子陣列,遞迴實現,分治法
尋找最大子陣列 遞迴.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。遞迴法尋找最大子陣列 include include include include using namespace std 函式只可以return乙個值,如果想返回多值,可以 1 使用結構 struct stru...
最大子陣列(分治法)
尋找a low,high 中的最大連續子陣列a i,j mid low high 2,欲求的最大連續子陣列出現的位置 1 出現在a low,mid 中 即 low i j mid 2 出現在a mid 1,high 中,即 mid 3 跨越了mid位置,出現在a low,high 中,即 low i...