42 連續子陣列的最大和

2022-06-07 14:24:11 字數 2078 閱讀 8083

問題:輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o(n)。

解題思路:

1.本來我想的是用二維陣列的動態規劃方法:用s[i][j]表示從第i個元素到第j個元素之間的所有子陣列的和的最大值

我在初始化二維陣列s的時候遇到了一些麻煩,我初始化的方法如下:

s = [[0]*length]*length,其中length是輸入的整形陣列的長度,經過一番除錯發現這種初始化二位陣列存在問題,經過上網搜查一番發現了問題所在:

print

(a)輸出為[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

原因是建立乙個列表,然後複製三個,相當於二維陣列中,引用的是同乙個一位陣列。意思就是:a = [[b]]*3只是建立了3個指向b的應用,所以一旦b改變,a中的3個列表也會改變。

生成方法更改為:

b = [ for i in range(3)]

print(b)

輸出為[[1], [2], [3]]

可以檢視列表的id就知道了:

print

(id(a[0]))

print(id(a[1]))

print

(a)輸出為:

4489350984

4489350984[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

b = [ for i in range(3)]

print

(id(b[0]))

print(id(b[1]))

print

(b)輸出為:

4489370184

4489370056[[1], [2], [3]]

經過修改後我的**如下(但是不能解決本問題,因為不能確保是連續的子陣列):

class solution:#

該方法不能確保是連續的子陣列!

def maxsubarray(self, nums: list[int]) ->int:

length =len(nums)

s = [[0] * length for _ in

range(length)]

for i in

range(length):

s[i][i] =nums[i]

for i in range(length-2,-1,-1):

for j in range(i+1,length):

s[i][j] = max((nums[i]+s[i+1][j]),(s[i][j-1]+nums[j]),s[i+1][j],s[i][j-1])

return s[0][length-1]

該問題只需要一位陣列的動態規劃方法即可解決:

class

solution:

def maxsubarray(self, nums: list[int]) ->int:

dp = len(nums)*[0]

dp[0]=nums[0]

for i in range(1,len(nums)):

dp[i]=max(nums[i],dp[i-1]+nums[i])

return max(dp)

拓展:如果要求 時間複雜度為o(n),空間複雜度為o(1)  【美團面試】

#

思路:掃一遍所有數字,同時記錄當前的累加和sum_,如果累加和小於0了就置回0,如果累加和比當前記錄的最大結果max_sub要大就更新max_sub。

defmaxsumofsubarray(arr):

max_sub =0

sum_ =0

for i in

range(len(arr)):

sum_ +=arr[i]

if sum_ <0:

sum_ =0

else

: max_sub =max(max_sub,sum_)

return max_sub

42 連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...

42 連續子陣列的最大和

題目 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始...

42 連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...