lc最大子序和

2021-10-18 11:42:30 字數 1653 閱讀 2809

[-2,1,-3,4,-1,2,1,-5,4]

解的序列【4,-1,2,1】

思想:如果當前所指元素之前的序列和(cur)小於0,則丟棄之前的序列max=nums[i],如果當前所指元素之前的序列和(cur)大於0,則當前元素加上之前的序列和,max=cur+nums[i]

class

solution

return maxs;}}

;

用f(i)表示以下標i為結尾的最大子串行和;

那麼最大序列和max=max(f(i)) i=1…n;

其中f(i)=max(f(i-1)+nums[i],nums[i])

這裡也可以理解如果f(i-1)>0;那麼nums[i]=f(i-1)+nums[i] ;否則還是nums[i]自身最大。

int

maxsubarray

(vector<

int>

& nums)

int maxs=nums[0]

;for

(int j=

1;jsize()

;j++

)//求最大的nums[i]

return maxs;

}

計算(l,r)之間的最大子串行可以分治地求(l,m)以及(m+1,r)即將乙個序列分為左右兩部分;即m=(l+r)/2;不斷的分下去直到每組只剩下乙個元素,再考慮,是否要和左右合併其中:

lsum:是以l為左端點陣列的最大序列和

rsum:是以r為右端點陣列的最大序列和

maxsum:是(l,r)內的最大序列和

lrsum:是(l,r)的序列和

所以,以(l,m)、(m+1,r)為例

lrsum=[l,m].isum+[m+1,r].isum;//左區間+右區間

lsum=max([l,m].lsum , [l,m].lrsum+[m+1,r].lsum)左區間還是左+一部分右

rsum=max([m+1,r).rsum ,[l,m].rsum+[m+1,r].lrsum)右區間還是右區間+一部分左

maxsum=max(lsum,rsum,[l,m].rsum+[m+1,r].lsum),從左端點開始連續的一段還是右端點連續的一段還是中間連續的一段

struct status 

; status merge

(status l,status r);}

status sumlr

(vector<

int>

& a,

int l,

int r)

;int m=

(l+r)/2

; status lstatus=

sumlr

(a,l,m)

; status rstatus=

sumlr

(a,m+

1,r)

;return

merge

(lstatus,rstatus);}

intmaxsubarray

(vector<

int>

& nums)

最大子序和

演算法一 對這個問題,有乙個相對複雜的 o nlogn 的解法,就是使用遞迴。如果要是求出序列的位置的話,這將是最好的演算法了 因為我們後面還會有個 o n 的演算法,但是不能求出最大子串行的位置 該方法我們採用 分治策略 divide and conquer 在我們例子中,最大子串行可能在三個地方...

最大子序和

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。方法一 雙指標窮舉法 思路 要找到最大和的連續陣列,那麼就將所有可能的和都拿到,取到最大的即...

最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。分析 1.暴力遍歷...