給定乙個整數陣列nums
,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
input:[
-2,1
,-3,
4,-1
,2,1
,-5,
4]output:
6
動態規劃 ( python )class
solution
:def
maxsubarray
(self, nums)
->
int:
tmp = nums[0]
maxlen = tmp
for i in
range(1
,len
(nums)):
if(tmp <0)
: tmp = nums[i]
else
: tmp += nums[i]
maxlen =
max(maxlen, tmp)
return maxlen
基本思路
動態規劃的思想是最優解包含的每個子問題的解也是最優的。**中的tmp
代表的就是子問題的最優解,不過因為這道題中有負數的存在,所以子問題的最優解也可能是負數,所以還需要和0進行比較。另外,這道題沒有代價的概念,只有值的累加,不需要儲存每個子問題的最優解,只需要上一輪的最優解即可。maxlen
變數不是主角,其作用只是記錄當前最大值而已。
複雜度分析
for
迴圈的時間開銷為o(n
)o(n)
o(n)
,內部為o(1)
,所以時間複雜度為o(n
)o(n)
o(n)
。空間複雜度為o(1
)o(1)
o(1)
分冶法 ( python )
class
solution
:def
maxsubarray
(self, nums)
->
int:
length =
len(nums)
if(length <=0)
:return
0return self.calsubarray(nums,
0, length -1)
defcalsubarray
(self, nums, left, right):if
(left == right)
:return nums[left]
mid =
(left + right)//2
maxleft = self.calsubarray(nums, left, mid)
maxright = self.calsubarray(nums, mid +
1, right)
#從mid為起點,向左計算最大子串行和, ct意為continuity,連續的
tmp =
0 left_ct = nums[mid]
for i in
range
(mid, left -1,
-1):
tmp += nums[i]
left_ct =
max(tmp, left_ct)
#以mid為起點,向右計算最大子串行和
tmp =
0 right_ct = nums[mid +1]
for i in
range
(mid +
1, right +1)
: tmp += nums[i]
right_ct =
max(tmp, right_ct)
#計算左右子串行交界地帶最大子串行和
maxcross = left_ct + right_ct
return
max(maxleft, maxright, maxcross)
基本思路
分冶法是將原問題逐步劃分成乙個個更小的子問題,再合併的過程。maxleft
和maxright
是被劃分出的左右兩個序列的最大子序和,但這兩者是不能直接相加的,因為它們在序列裡有可能不是連續的。另外,這兩個序列原先是交接的,它們的交界地帶有可能存在乙個更大的子串行和,所以需要以mid
為起點,分別向左右兩邊累加,求得交界地帶最大值。下面舉兩個例子。
input:[
2,-1
,2]說明:這個序列會被劃分成[2]
,[-1
,2]兩個子串行。
最大子串行和分別為 2
,2。但因為兩個2索引不是連續的,所以不能直接相加
input:[
-1,2
,1,2
,-1,
1]說明:這個序列會被劃分成[-1
,2,1
],[2,-
1,1]。
左側最大序列和為 2,右側最大序列和也是2。但是它們的交界地帶有乙個更大的子串行[2,
1,2]
複雜度分析
分冶法的時間複雜度為o(n
2)
o(n^2)
o(n2
), 因為calsubarray
被呼叫了n次,這和二分法是不同的,另外遞迴實現也會帶來一定的開銷。空間複雜度為 o(1
)o(1)
o(1)
。參考資料
leetcode最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。在本題中,我想到的兩...
Leetcode 最大子序和
題目描述 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。解題思路 ...
最大子序和 leetcode
最大和子串行有乙個特徵就是,最大和子串行的起始位置之前的元素相加和肯定是小於等於0的,否則如果大於0,那麼起始點就是前面元素的起始點了,只要大於0就會對子序列起到增加最大值的作用。本演算法正式利用這一特點,只計算所有可能出現最大和的子串行。看下面這個例子 1 2 3 3 4 5 11 7 8 這個序...