标签:nums Python 复杂度 子段 本题 数组 字串 解法 AcWing
连续子数组的最大和 Python O ( n ) O(n) O(n)解法
题目
题目链接:https://www.acwing.com/problem/content/description/50/
题目描述
输入一个非空整型数组,数组里的数可能为正,也可能为负。
数组中一个或连续的多个整数组成一个子数组。
求所有子数组的和的最大值。
要求时间复杂度为 O ( n ) O(n) O(n)。
样例
输入:[1, -2, 3, 10, -4, 7, 2, -5]
输出:18
解题
思路分析
本题的常规解题路线有3种:
- 暴力枚举,优化后时间复杂度为 O ( n 2 ) O(n^2) O(n2)
- 分治,分别考虑字串在左边、字串在中间、字串在右边三种情况,时间复杂度为 O ( n l o g n ) O(nlog n) O(nlogn)
- 动态规划,也就是本题要讲的一种方法,时间复杂度为 O ( 1 ) O(1) O(1)
常规解法很容易想到,也很容易做出来,但是由于需要两个for
循环嵌套,所以其时间复杂度为
O
(
n
2
)
O(n^2)
O(n2),不满足本题的要求。故本题使用动态规划法。
输入三个变量
l = len(nums) # 数组长度,用于后续遍历使用
s = max(nums) # 和为数组最大值,最大值的目的是防止数组元素全负导致出0
b = 0 # 初始化变量
开始遍历
对b
进行判断
- 如果
b>0
:说明当前这个子串有可能是最大的,那就继续加上第i
项; - 如果
b<=0
:说明当前这个字串和为负,那就没有比较的意义了,将b初始化为第i
项 - 最后判断
b>s?
- 如果
b
大于s
,则更新s
的值为b
- 如果
最后输出s
的结果即可
代码实现
AcWing答题模式代码
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
l = len(nums) # 数组长度
s, b = max(nums), 0 # 初始化最大和,子段和
for i in range(0, l):
if b > 0: # 判断子段和的值
b += nums[i]
else:
b = nums[i]
if b > s:
s = b
return s
普通模式代码
nums = eval(input()) # 从控制台读取数组,格式为[1,2,3,...]
l = len(nums) # 数组长度
s, b = max(nums), 0 # 初始化最大和,子段和
for i in range(0, l):
if b > 0: # 判断子段和的值
b += nums[i]
else:
b = nums[i]
if b > s:
s = b
print(s)
标签:nums,Python,复杂度,子段,本题,数组,字串,解法,AcWing 来源: https://blog.csdn.net/weixin_44289959/article/details/115524763
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。