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

文章目录

  • 1. 题目
  • 2. 解题思路
  • 3. 代码实现
  • 4. 总结
  • 5. 参考文献

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丛书

你可能感兴趣的:(算法)