题目描述:
输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。
输入描述:
【重要】第一行为数组的长度N(N>=1)
接下来N行,每行一个数,代表数组的N个元素
输出描述:
最大和的结果
思路:
本题主要考察的知识点:动态规划
本题的思路可以转化为:“对数组中的任意元素,若我们知道以它作为最后一个元素的所有连续子数组的最大和是多少,那么原问题的解就是在这n个最大和中最大的那个。
”再来看如何求解“对数组中的任意元素,若我们知道以它作为最后一个元素的所有连续子数组的最大和是多少”。因为有了2个限制条件“连续”、“它是最后一个”,那么问题又可以再次“减治”,等价于“若我们知道它上一个元素作为最后一个元素的所有连续子数组的最大和是多少,只要它不是负数,那么此问题就是它加上最后一个元素的值,否则直接用最后一个元素的值即可”。
以数组【1, -2, 3, 10, -4, 7, 2, -5】为例来进行说明:
遍历数组:
结尾元素 | 可能取值 | 最大值 | 最终最大值 |
1 | 1 | 1 | 1 |
-2 | 1+(-2)/-2 | -1 | 1 |
3 | -1+3/3 | 3 | 3 |
10 | 3+10/10 | 13 | 13 |
-4 | 13+(-4)/-4 | 9 | 13 |
7 | 9+7/7 | 16 | 16 |
2 | 16+2/2 | 18 | 18 |
-5 | 18+(-5)/-5 | 13 | 18 |
python代码实现:
1 #输入 2 def max_sum(): 3 #输入的数据个数 4 N = int(input()) 5 #保存输入的数据 6 input_N = [] 7 for _ in range(N): 8 input_N.append(int(input())) 9 #保存以每个元素结尾的最大值 10 s = [0 for _ in range(N)] #初始化 11 s[0] = input_N[0] 12 for i in range(1,N): 13 s[i] = s[i-1] + input_N[i] 14 s[i] = max(s[i],input_N[i]) 15 #计算以每个元素结尾的最大值(n个)的最大值 16 max_s = max(s) 17 18 return max_s 19 20 print(max_sum())
输出结果: