剑指offer系列-面试题42-连续子数组的最大和(python)

1. 题目

输入一个整型数组,数组里有正数也有负数,数组中的一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n)。

2. 解题思路

详情见 面试题42. 连续子数组的最大和(动态规划,清晰图解)

书中的思路

子数组的累加和小于零的元素都不要,从当前元素重新开始累加。

3. 代码实现

时间复杂度O(n),空间复杂度S(1)

# 全局变量,输入是否有效
g_invalid_input = False
def find_greatest_sum_of_subaray(array):
    """
    思路:时间复杂度O(n),空间复杂度S(1)
    获取所有子数组中的和的最大值
    :param array: 数组
    """
    # 边界条件
    if not array or not isinstance(array, list):
    	
        return 0
    
    # 当前累加和, 最大累加和
    cur_sum, greatest_sum = 0, None
	
	for val in array:
		# 当上一次的子数组累加和小于零时,从当前元素开始重新计算累加和
		if cur_sum <= 0:
			cur_sum = val
		else: # 当上一次的子数组的累加和大于零时,在累积加上当前元素。
			cur_sum += val
		
		if greatest_sum is None or cur_sum > greatest_sum:
			greatest_sum = cur_sum
	return greatest_sum

if __name__ == '__main__':
    seq = [1, -2, 3, 10, -4, 7, 2, -5, 7]
    res1 = find_greatest_sum_of_subaray(seq)
    print(res1)

4. 总结

通过举例子分析数组规律。

5. 参考文献

[1] 剑指offer丛书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值