Python實現最大子序和的方法示例

2022-10-04 17:00:16 字數 2420 閱讀 8993

描述

給定乙個序列(至少含有 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 位置上的最大子連...