python分治法實現最大子陣列問題

2021-10-10 10:34:54 字數 1748 閱讀 4851

給定乙個整數陣列 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...