問題:輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o(n)。
解題思路:
1.本來我想的是用二維陣列的動態規劃方法:用s[i][j]表示從第i個元素到第j個元素之間的所有子陣列的和的最大值
我在初始化二維陣列s的時候遇到了一些麻煩,我初始化的方法如下:
s = [[0]*length]*length,其中length是輸入的整形陣列的長度,經過一番除錯發現這種初始化二位陣列存在問題,經過上網搜查一番發現了問題所在:
(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就知道了:
(id(a[0]))
print(id(a[1]))
(a)輸出為:
4489350984
4489350984[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
b = [ for i in range(3)]
(id(b[0]))
print(id(b[1]))
(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]
該問題只需要一位陣列的動態規劃方法即可解決:
classsolution:
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個開始,到第...