最大子陣列問題的python實現
給乙個leetcode原題鏈結新增鏈結描述
有興趣可以去嘗試,並不是很難。
給定乙個無序陣列,其中包含正數和負數,要求找出該陣列中連續的幾個數,其和相加為最大
#1、暴力法,遍歷該該陣列中所有子陣列
import random
defmax_violent
(arr)
:max=-
100 a=
0 b=
0for i in
range
(len
(arr)):
#每次所取子陣列的頭
for j in
range
(i,len
(arr)):
#每次所取子陣列的尾
tar=
0for k in
range
(i,j+1)
:#累加該陣列元素
tar=tar+arr[k]
if tar>
max:
max=tar
a=ib=k
return
(max
,a,b)
arr=
for i in
range(10
):-10
,10))
print
(arr)
print
('暴力方法:'
,max_violent(arr)
)
2、分治思想:
當尋找乙個陣列的最大子陣列的,我們選取子陣列的中間元素為基準,這樣最大子陣列的所在不外乎三種情況
一、子陣列完全在基準元素之前;二、子陣列完全在基準元素之後; 三、子陣列跨過基準元素,部分在前,部分在後
def
max_digui
(arr,low,high)
:if low==high:
return arr[low]
mid=
(low+high)//2
m1=max_digui(arr,low,mid)
m2=max_digui(arr,mid+
1,high)
now_left=arr[mid]
maxleft=now_left
for i in
range
(mid-
1,low-1,
-1):
now_left=now_left+arr[i]
if now_left>maxleft:
maxleft=now_left
now_right=arr[mid+1]
maxright=now_right
for j in
range
(mid+
2,high+1)
: now_right=now_right+arr[j]
if now_right>maxright:
maxright=now_right
m3=maxleft+maxright
result=
max(m1,m2,m3)
return result
print
(max_digui(arr,0,
len(arr)-1
))
3、動態規劃法:
統計前n項和,當前n項和大於0時,說明當向後尋找時可能變得更大,若找到更大值,更新最大值
而當前n項和小於0時,說明最大陣列不可能包含這n項,然後捨去前n項,重新更新陣列
def
max_dongtaiguihua
(arr)
: t=arr[0]
sum=t
max=sum
for i in
range(1
,len
(arr)):
ifsum
>0:
sum=
sum+arr[i]
ifsum
>
max:
max=
sumelse
:sum
=arr[i]
ifsum
>
max:
max=
sumreturn
maxprint
(max_dongtaiguihua(arr)
)
最大子陣列問題
顧名思義,最大子陣列問題是求乙個陣列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...