描述
給定乙個序列(至少含有 1 個數),從該序列中尋找乙個連續的子串行,使得子串行的和最大。
例如,給定序列 [-2,1,-3,4,-1,2,1,-5,4],
連續子串行 [4,-1,2,1] 的和最大,為 6。
我 v1.0
class solution:
def maxsubarray(self, nums):
""":type nums: list[int]
:rtype: int
"""
l = len(nums)
i = 0
result = nums[0]
while i < l:
sums =
temp = 0
for j in range(i, l):
temp+=nums[j]
sums.append(temp)
if result < max(sums):
result = max(sums)
i+=1
return result
測試結果如下:
本地執行時間為14.7s,說明我的方法太粗暴了。應該尋找更好的演算法。
我 優化後v1.1。優化方案,去掉sums陣列,節省空間。但時間複雜度仍然不變。
l = len(nums)
i = 0
result = nums[0]
while i < l:
temp = 0
for j in range(i, l):
temp+=nums[j]
if result < temp:
result = temp
i+=1
return result
仍然只通過200/202測試用例,仍然超出時間限制。但本地執行時間為8.3s。有進步。
別人,分治法。時間複雜度o(nlogn)
將輸入的序列分成兩部分,這個時候有三種情況。
1)最大子串行在左半部分
2)最大子串行在右半部分
3)最大子串行跨越左右部分。
前兩種情況通過遞迴求解,第三種情況可以通過。
分治法**大概如下,emmm。。。目程式設計客棧前還沒有完全理解。
def maxc2(ls,low,upp):
#"divide and conquer"
if ls is none: return 0
elif low==upp: return ls[low]
mid=(low+upp)/2 #notice: in the higher version python, 「/」 would get the real value
lmax,rmax,tmp,i=0,0,0,mid
while i>=low:
tmp+=ls[i]
if tmp>lmax:
lmax=tmp
i-=1
tmp=0程式設計客棧
for k in range(mid+1,upp):
tmp+=ls[k]
if tmp>rmax:
rmax=tmp
return max3(rmax+lmax,maxc2(ls,low,mid),maxc2(ls,mid+1,upp))
def max3(x,y,z):
if x>=y and x>=z:
return x
return max3(y,z,x)
動態規劃演算法,時間複雜度為o(n)。
分析:尋找最優子結wogliid構。
l = len(nums)
i = 0
sum = 0
maxsum = nums[0]
while i < l:
sum+=nums[i]
if sum > maxsum:
maxsum = sum
if sum < 0:
sum = 0
i+=1
return maxsum
oh!my god!!! !!!!!!!!執行只花了0.2s!!!!!!!!!!!!!!!這也太強了吧!!
優化後,執行時間0.1s.
sum = 0
maxsum = nums[0]
for i in range(len(nums)):
sum += nums[i]
if sum > maxsum:
maxsum = sum
if sum < 0:
sum = 0
return maxsum
其中sum += nums[i]必須緊挨。
maxsum = sum
本文標題: python實現最大子序和的方法示例
本文位址: /jiaoben/python/264867.html
最大子序和(最大子段和(python))
1 暴力求解 基本思路就是遍歷一遍,用兩個變數,乙個記錄最大的和,乙個記錄當前的和。時間複雜度 o n 3 80 ms 1 class solution def maxsubarray self,nums list int int tmp nums 0 max tmp n len nums for ...
最大子序和的golang實現
給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。首先理解題意 核心 取出第一位為基準值 sum nums 0 res sum 下標從1開始 for ...
leetcode最大子序和python
給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。題解 1 首先初始化兩個變數sums和ans,sums用來存放nums i 位置上的最大子連...