求兩個子陣列最大的累加和

2021-10-25 07:43:23 字數 1955 閱讀 3298

最近在學習演算法,發現左神左程雲講的是真的好,相見恨晚,推薦大家去學習。

【題目】

給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相

加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。

【要求】

時間複雜度達到 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...