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