最近在學習演算法,發現左神左程雲講的是真的好,相見恨晚,推薦大家去學習。
【題目】
給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相
加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。
【要求】
時間複雜度達到 o(n)
這道題要想做的順利,首先我們先需要知道乙個演算法原型,也就是這道題其實是演算法原型的公升級版本,其實演算法原型就是leetcod 53.最大子序和,而其中的差異性,就是我們需要尋找乙個位置把題目所給的陣列分成無重複的兩部分,而這兩部分的和恰好又是最大的。
一種想法是我們把所有的位置都試一遍,然後找出最大的,但是這樣時間複雜度就增加了,那麼有沒有更好的方法呢?
其實這個時候我就就可以考慮,能不能用空間換時間,我們可以建立兩個陣列l和r,而l(i)代表,從0開始到i結束,這段區間內陣列的最大值,而r也採用相同的思想,不同的就是陣列就是從後向前遍歷得到的。
而最後我們只需要保證無重複的,把最大值的和加起來就可以了。
注意:到這一步有一點需要學習,因為最後我們要加的時候,也是從前向後遍歷相加的,所以l陣列其實沒必要存在,我們只需要乙個變數來存最大值就可以了,這樣可以進一步降低空間複雜度
程式原始碼
def
maxsumbetweentwosubarray
(nums):if
not nums or
len(nums)
<2:
return
0 r_array =[0
]*len(nums)
r_array[
len(nums)-1
]= nums[
len(nums)-1
] cur = nums[
len(nums)-1
]for i in
range
(len
(nums)-2
,-1,
-1):
cur =
0if cur <
0else cur
cur += nums[i]
r_array[i]
=max
(cur, r_array[i +1]
) res = nums[0]
+ r_array[1]
l_max = nums[0]
cur = nums[0]
for i in
range(1
,len
(nums)-1
):cur =
0if cur <
0else cur
cur += nums[i]
l_max =
max(l_max, cur)
res =
max(res, l_max+r_array[i+1]
)return res
函式原型**leetcode 53
. 最大子序和
class
solution
:def
maxsubarray
(self, nums: list[
int])-
>
int:
ifnot nums:
return
0 cur,res = nums[0]
,nums[0]
for i in
range(1
,len
(nums)):
cur =
0if cur <
0else cur
cur += nums[i]
res =
max(res,cur)
return res
求兩個子陣列最大的累加和
來自牛客網左程雲演算法第二堂課第一題 問題 給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。要求 時間複雜度達到 o n 解法 我們很容易想到將整個陣列分成兩個部分,然後分別求這兩個部分子陣列的最大累加和。將結果累加起...
陣列拆分為兩個子陣列
怎麼把乙個陣列拆分成兩個非空的子陣列,而且如果兩個陣列裡的元素能夠一一對應,那麼不論順序如何,都認為是重複的 例如和是一樣的。輸入例子 1,2,3輸出例子 1 2 32 1 3 1 3 2也一樣 3 1 2輸入例子 1 2 2輸出例子 1 2 2 2 2 1 2 12 2 1 21.遞迴求解,去重 ...
兩個子串行的最大點積
給你兩個陣列nums1和nums2。請你返回nums1和nums2中兩個長度相同的非空子串行的最大點積。陣列的非空子序列是通過刪除原陣列中某些元素 可能乙個也不刪除 後剩餘數字組成的序列,但不能改變量字間相對順序。比方說,2,3,5 是 1,2,3,4,5 的乙個子串行而 1,5,3 不是。示例 1...