每天一道算法题(2019.3.5)

本文探讨了三种求解最大子序列和问题的算法:暴力求解法、动态规划法和改进的遍历法。详细介绍了每种算法的实现思路及代码示例,对比了它们的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值