Q:给定一个序列,求最大子序列
思路1: 暴力求解法:把所有可能的子序列列出来作比较,利用双层循环,复杂度为O(n^2)。
def maxSubArray(list):
res = list[0]
for i in range(length(list)):#the start index of subArray
maxTmp = 0
for j in range(i, length(list)):# the end index on subArray
maxTmp += list[j]
if maxTmp > max:
res = maxTmp
return res
思路2: 利用动态规划的方法,dp(i)表示以第i个数结尾的和最大子序列。动态转移关系为:
dp(i)=max(dp(i-1)+list[i], list[i])
def maxSubArray(list):
if length(list) == 1:# if length egale 1, translation does not existe
return list[0]
dp = res = list[0]# res by default
for i in range(1,length(list)):
dp = max(dp+list[i], list[i]) # translation
res = max(res, dp)
return res
思路3: 遍历整个序列,累加求和,当和小于零的时候,更新和为零;同时保存最大值。
def maxSubArray(list):
res = temp = 0
for i in range(len(list)):
temp += list[i]
res = max(temp, res)
if temp <= 0:
temp = 0
return res